本文已参与「新人创作礼」活动,一起开启掘金创作之路
希尔排序
1、执行流程
原始序列:49 38 65 97 76 13 27 49 55 04 (序列中有两个49,其中一个加粗加以区分并可以验证该排序算法稳定性)
因为原始序列长度为10,所以n=10/2=5,按照n=5的增量划分,划分结果如下:
49 13 38 27 65 49 97 55 76 04
每组进行直接插入排序,得到如下结果:
13 49 27 38 49 65 55 97 04 76
从而得到如下序列:
13 27 49 55 04 49 38 65 97 76
再次计算n/2,即5/2=3,按照n=3的增量划分,得到的划分结果如下:
13 55 38 76 27 04 65 49 49 97
每组进行直接插入排序,得到如下结果:
13 38 55 76 04 27 65 49 49 97
从而得到如下序列:
13 04 49 38 27 49 55 65 97 76
最后以增量为一进行划分,就相当于最后进行一次直接插入排序,得到最终结果:
04 13 27 38 49 49 55 65 76 97
至此已完成希尔排序,数列已变为从小到大排列
2、执行代码
public class ShellSort {
public static void sort(int num[], int n) {
int i, j, k, temp;
int count = 0;
while(n > 1) {
n = n / 2;
for(i = 0; i < n; i++) {
for(j = i + n; j < num.length; j = j + n) {
temp = num[j];
for(k = j - n; k >= 0 && num[k] > temp; k = k - n) {
num[k + n] = num[k];
}
num[k + n] = temp;
}
}
System.out.print("第"+(++count)+"趟:");
for(k = 0; k < num.length; k++) {
System.out.print(num[k] + " ");
}
System.out.println();
}
}
public static void main(String[] args) {
int mynum[] = {49, 38, 65, 97, 76, 13, 27, 49, 55, 4};
sort(mynum, mynum.length);
}
}
3、性能分析
时间复杂度:O(n^1.3^) --- O(n^2^) 空间复杂度:O(1) 稳定性:不稳定