思路
- 希尔排序使用一个序列h1, h2, ···, ht,叫做增量序列。只要h1 = 1,任何增量序列都是可行的。
- 在使用增量hk的一趟排序后,对于每一个位置i,有A[i] ≤ A[i + k],即所有间隔hk的元素都是已排序的。此时称文件是hk-排序的。
- 一个hk-排序的文件保持它的hk-排序性。一般做法是,对于hk, hk + 1, ···, N - 1中对应的每一个位置i,把其上的元素放到i, i - hk, i - 2hk, ···中间的正确位置上。
- 一趟hk排序的作用就是对hk个独立的子数组执行一次插入排序。
- 流行的增量序列:
时间复杂度
代码
public int[] SortAsc(int[] arr, int Length){ for (int Step = Length / 2; Step > 0; Step /= 2) { for (int i = Step; i < Length; i++) { var tmp = arr[i]; int j = i; for (; j >= Step; j -= Step) //j >= Step 防止j -= Step时造成j - Step为负数。换句话说即:当j逐渐减小时,若比Step下标小, //则意味着上一个j表示的元素已经是该组插入排序的第一个元素 { if (arr[j - Step] > tmp) arr[j] = arr[j - Step]; else break; } arr[j] = tmp; } } return arr;}