基本思路:
1.先选定一个小于N的整数gap作为第一增量,然后将所有距离为gap的元素分在同一组,
并对每一组的元素进行直接插入排序。然后再取一个比第一增量小的整数作为第二增量,重
复上述操作…
2.当增量的大小减到1时,就相当于整个序列被分到一组,进行一次直接插入排序,排序完成。
注意:
- 当 gap = 1 时,即最后一趟的排序就是希尔排序的直接插入排序
- gap由大到小的原因:gap越大,数据挪动得越快;gap越小,数据挪动得越慢。前期让gap较大,可以让数据更快得移动到自己对应的位置附近,减少挪动次数。
调用插入函数的写法:
#include <iostream>
using namespace std;
//希尔排序
void ShellSort(int arr[], int length)
{
int gap = length;//gap的个数是指数字与数字之间有几个间隔
while (gap > 1)//注意这里的边界条件
{
gap = gap / 2;
if (gap == 1)//当gap为1时
{
InsertSort(arr, length);//调用插入排序函数
break;
}
for (int i = 0; i < length - gap; i++)//注意边界条件 length-gap
{
int begin = i;
if (arr[begin] > arr[begin + gap])
{
swap(arr[begin], arr[begin + gap]);
}
}
}
}
int main()
{
//int arr[] = { 1, 5, 6, 7, 4, 3, 2 };测试用例一
//int arr[] = { 9,1,2,5,7,4,8,6,3,5};
int arr[] = { 5, 4, 3, 2, 1,0};
//InsertSort(arr, sizeof(arr) / sizeof(int));插入排序
ShellSort(arr, sizeof(arr) / sizeof(int));
for (auto e : arr)
{
cout << e << " ";
}
return 0;
}
将插入函数用代码作替换的写法:
//希尔排序
void ShellSort(int arr[], int length)
{
int gap = length;//gap的个数是指数字与数字之间有几个间隔
while (gap > 1)//注意这里的边界条件
{
gap = gap / 2;
if (gap == 1)//当gap为1时
{
//InsertSort(arr, length);//调用插入排序函数
int end = 0, insert = 0; //将插入函数用代码作替换
for (int i = 0; i < length-1; i++)
{
end = i;
insert = i + 1;
while (end >= 0)
{
if (arr[end] > arr[insert])
{
swap(arr[end], arr[insert]);
insert--;
end--;
}
else
{
break;
}
}
}
break;
}
for (int i = 0; i < length - gap; i++)//注意边界条件 length-gap
{
int begin = i;
if (arr[begin] > arr[begin + gap])
{
swap(arr[begin], arr[begin + gap]);
}
}
}
}
int main()
{
//int arr[] = { 1, 5, 6, 7, 4, 3, 2 };测试用例一
int arr[] = { 9,1,2,5,7,4,8,6,3,5};
//int arr[] = { 5, 4, 3, 2, 1,0};
//InsertSort(arr, sizeof(arr) / sizeof(int));插入排序
ShellSort(arr, sizeof(arr) / sizeof(int));
for (auto e : arr)
{
cout << e << " ";
}
return 0;
}