基本思想
希尔排序又称“最小增量排序”,它是对插入排序的优化,基本思想是先将待排序序列分为若干子序列分别进行直接插入排序,待整个序列“基本有序”,在对全体进行一次直接插入排序。
以数组ar[] = { 8,5,7,6,3,4,1,9,0,2 }为例,选取增量gap=len/2,将整个数组分为5个子序列,分别对每个子序列进行直接插入排序。
8 | 5 | 7 | 6 | 3 | 4 | 1 | 9 | 0 | 2 |
一趟排序完后结果为
4 | 1 | 7 | 0 | 2 | 8 | 5 | 9 | 6 | 3 |
然后不断缩小增量直到增量为1,最后进行一次直接插入排序即可。
代码实现
void ShellSort(int* nums, int len)
{
int i, j, tmp;
for (int gap = len / 2; gap > 0; gap /= 2)
{
for (i = gap; i < len; i++)
{
tmp = nums[i];
for (j = i - gap; j >= 0 && nums[j] > tmp; j -= gap)
{
nums[j + gap] = nums[j];
}
nums[j + gap] = tmp;
}
}
}