【排序算法系列 1】冒泡排序 【排序算法系列 2】选择排序 【排序算法系列 3】 插入排序 【排序算法系列 4】 高级排序——希尔排序(插入排序的改进) 【排序算法系列 5】 高级排序——归并排序 【排序算法系列 6】 高级排序——归并排序(由冒泡排序改进) 【排序算法系列 7】堆排序
简介
希尔排序是插入排序的一种,又称“缩小增量排序”,是插入排序算法的一种更高效的改进版本。
需求
排序前:{9,1,2,5,7,4,8,6,3,5}排序后:{1,2,3,4,5,5,6,7,8,9}
希尔排序原理
选定一个增长量h,按照增长量h作为数据分组的依据,对数据进行分组;对分好组的每一组数据完成插入排序;减小增长量,最小减为1,重复第二步操作。
增长量h的确定
增长量h的值每一固定的规则,我们这里采用以下规则:N是数组的长度
int h
=1
while(h
<N
/2){
h
=2h
+1;
}
h
=h
/2
希尔排序API设计
类名Shell
构造方法Shell():创建Shell对象成员方法 11.public static void sort(Comparable[] a):对数组内的元素进行排序成员方法 22.private static boolean greater(Comparable v,Comparable w):判断v是否大于w成员方法 33.private static void exch(Comparable[] a,int i,int j):交换a数组中,索引i和索引j处的值
希尔排序的代码实现
public class Shell {
public static void sort(Comparable
[] a
){
int h
= 1;
while(h
<a
.length
/2){
h
=2*h
+1;
}
while(h
>=1){
for (int i
=h
;i
<a
.length
;i
++){
for (int j
=i
;j
>=h
;j
-=h
){
if (greater(a
[j
-h
],a
[j
])){
exch(a
,j
-h
,j
);
}else{
break;
}
}
}
h
= h
/2;
}
}
private static boolean greater(Comparable v
,Comparable w
){
return v
.compareTo(w
)>0;
}
private static void exch(Comparable
[] a
,int i
,int j
){
Comparable temp
;
temp
= a
[i
];
a
[i
]=a
[j
];
a
[j
]=temp
;
}
}
希尔排序的时间复杂度: O(n^(1.3~2))