/*
* shell排序(希尔排序)
* 基本思想:希尔排序选取一个增量h,也就是把整个数组分成h份,对每一份进行排序。
* 然后减少增量h,重复上述过程。
* 一般我们选取的递增序列为:3*h+1 即1,4,13,40,.....
* 实现:用一个while语句求出对应数组我们所需要的最大h
* 然后在用一个外层while循环控制h,每循环一次h=h/3;直至h自减至1;
* 内层是直接插入排序算法,两个for循环嵌套,外层for循环用来控制i - a.length的自增
* 内层for循环用来找到i需要插入的位置。
* 复杂度分析:
* 时间复杂度:希尔排序最好情况是数组正序,此时外层for循环执行一次+最外层while循环<n次;内层for循环不执行, O(n)
* 最坏情况是数组逆序,外层for循环+while<n次,内层for每次都需要把n个数据向后移动一位; O(n^2)
* 平均情况: O(n^1.3) 站在巨人的肩膀上看问题
* 空间复杂度:
* 需要一个temp用来临时交换数据,一个h来保存增量 O(1)
*
*
*/
public static void shellSort ( int[] a){
int len = a.length;
int h = 1;
while (h < len / 3)
h = h * 3 + 1;
while (h > 0) {
for (int i = h; i < len; ++i) {
for (int j = i; j >= h; j = j - h) {
if (a[j] < a[j - h]) {
int temp = a[j];
a[j] = a[j - h];
a[j - h] = temp;
}
}
}
h = h / 3;
}
}
Ps:博文为博主的学习笔记,算法只是按照自己的理解简单分析,初学者建议看详细的图文讲解,如果有错误,欢迎交流指正