希尔排序
希尔排序基本思想
希尔排序(Shell Sorting)是1959年由D.L.Shell提出来的,是对直接插入排序的一种改进。
希尔排序是先将整个待排序记录序列分割成若干个字序列,每个子序列由相隔某个“增量”的记录组成的,对每个子序列分别进行直接插入排序,待整个序列中的记录基本有序(增量足够小)时,再对全部记录进行一次直接插入排序。在希尔排序的过程中,需要不断缩小增量来将待排序序列分割成不同的子序列,因此又称为缩小增量排序。
排序过程
-
设增量用dk表示,一般设初始值dk = N/2,N为序列中记录个数,即先把所有距离为dk的记录分成一个子序列,整个记录序列被分割成了dk个子序列,并分别对个各子序列进行直接插入排序;
-
然后缩小增量dk,一般取dk = dk/2,重复前面的分割子序列和插入排序;
-
重复上述步骤,直到取dk = 1(即增量为1)为止,这时所以的记录作为一组进行一次直接插入排序,即得到有序序列。
算法实现
public int[] shellSorting(int[] arr){
int len = arr.length;
for(int dk = len/2;dk>0;dk /= 2){
for(int i = dk;i<len;i++){
int key = arr[i];
int j = i -dk;
while (j >=0 && arr[j] > key){
arr[j+dk] = arr[j];
j -= dk;
}
arr[j+dk] = key;
}
}
return arr;
}
/**
* 测试希尔排序
*/
@Test
public void TestShellSorting(){
int[] arr = new int[]{8,1,5,2,4,10,3,6,9,7};
for (int i : shellSorting(arr)) {
System.out.print(i+" ");
}
}
算法分析
- | - |
---|---|
时间效率 | O( n^(3/2) ) |
空间效率 | O(1) |
稳定性 | 不稳定 |