希尔排序思想:又称“缩小增量排序”,先将整个待排记录序列分割成为若干个子序列,对每个子序列分别直接插入排序,待整个序列记录“基本有序”时,再对全体记录进行一次直接插入排序。
代码如下:
void shell_sort(int arr[], int sz)
{
//自己定义一个增量数组
int add[MAX] = { 0 };
int sz_d = 0;
int ret = sz;
while (ret > 1)
{
add[sz_d++] = ret / 2;
ret = ret / 2;
}
//增量排序,使用选择排序
//i表示每次要放入的位置
int i = 0;
int j = 0;
int sz_l = 0;
int y = 0;
//要进行sz_d次增量排序
for (i = 0; i < sz_d; i++)
{
//增量长度
sz_l = add[i];
//要插入的次数
for (j = sz_l; j < sz; j++)
{
//将要插入的元素与有序的最后一个元素进行比较
if (arr[j] < arr[j - sz_l])
{
int tmp = arr[j];
//找要插入的位置
for (y = j - sz_l; y >= 0 && arr[y] > tmp; y-=sz_l)
{
arr[y + sz_l] = arr[y];
}
arr[y + sz_l] = tmp;
}
}
}
}