iOS算法系列(4)
2017-03-23 本文已影响7人
李某lkb
<h1>希尔排序</h1>
希尔排序是先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序.
public class 希尔排序 {
private void shellSort(int[] array) {
int gap = array.length / 2;// 初始化gap为数组长度/2
while (1 <= gap) {// 中止条件是gap<1
// 对步长为gap的元素进行分组
// 交替的对每组进行直接插入排序
for (int i = gap; i < array.length; i++) {
int temp = array[i];// 待排序的数据
int j = 0;// 有序区中待比较元素的下标,初始时,从有序区中最后一个元素开始比较起
// 对步长为 gap 的元素组进行排序
for (j = i - gap; j >= 0 && temp < array[j]; j = j - gap) {
array[j + gap] = array[j];
}
array[j + gap] = temp;
}
System.out.format("gap = %d:\t", gap);
printAll(array);
gap = gap / 2; // 减小增量
}
}
return arr;
}
最佳情况:T(n) = O(nlog2 n)
最坏情况:T(n) = O(nlog2 n)
平均情况:T(n) =O(nlog n)
//我也是理解了好久希尔排序,一共需要三个循环,最外层控制间隔,第二层控制组数,第三层交换.
我一开始很不理解这里.
for (j = i - gap; j >= 0 && temp < array[j]; j = j - gap) {
array[j + gap] = array[j];
}
我在想,我是一开始的时候这个很正确,但是我折半又折半的时候分的是一个大组,一开始还是两个一组.直到后来,我想明白了,这些无关大雅,毕竟当i++起来的时候,他就是一大组了,前面的可能浪费了,但是核心还是一样的.