基本思想:
将整个待排序记录分割成若干个子序列,在子序列内分别进行直接插入排序,待整个序列中的记录基本有序时,对全体记录进行直接插入排序。
子序列不是被简单的“逐段分割”,而是将相距某个“增量”的记录组成一个子序列,希尔排序开始时增量较大,每个子序列中的记录个数较少,从而排序速度较快;当增量较小时,虽然每个子序列中记录个数较多,但整个序列已基本有序,排序速度也较快。
#include <iostream>
using namespace std;
void shellSort(int arr_int[], int n)
{
int j,step;
for(step = n/2; step>0; step = step/2)
{
for(int i=step+1; i<=n; i++)
{
j = i - step;
if(j>0 && arr_int[i]<arr_int[j])
{
arr_int[0] = arr_int[i];
arr_int[i] = arr_int[j];
arr_int[j] = arr_int[0];
}
}
}
}
int main()
{
int arr_int[] = {0,6,78,20,15,3,7,69,21};
int n = sizeof(arr_int)/sizeof(arr_int[0]) - 1;
shellSort(arr_int,n);
for(int i=1; i<=n; i++)
{
cout<<arr_int[i]<<" ";
}
return 0;
}