常见排序算法流程分析及其实现代码(三)

92 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

希尔排序

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);
	}
}

2020083112082044.png

3、性能分析

时间复杂度:O(n^1.3^) --- O(n^2^) 空间复杂度:O(1) 稳定性:不稳定