希尔排序
希尔排序也叫缩小增量排序,希尔排序使用一个序列h1,h2,…ht,叫增量序列,使用增量hk的一趟排序之后,对于每一个i我们都有A[i]<=A[i+K];所有相隔hk的元素都被排序,称文件为hk排序的。希尔排序重要性质是hk排序的文件保持它的hk排序性。
hk排序对于hk,hk+1,…N-1中的每一个位置i,把其上的元素放到i,i-hk,i-2*hk…中间的正确位置上,一趟hk排序的作用就是对hk个独立的子数组执行一次插入排序。
增量序列选择shell建议的序列(效率不高),ht=N/2和hk=hk+1/2。
存在一些其它的递增序列对算法运行时间做出重要的改进。
程序:
#include<iostream>
#include<vector>
#include <algorithm>
using namespace std;
void ShellSort(std::vector<int> A, int N)
{
int i, j, Increment;
int Tmp;
for (Increment = N / 2; Increment >0; Increment /= 2)
for (i = Increment; i<N; i++)
{
Tmp = A[i];
for (j = i; j >= Increment; j -= Increment)
if (Tmp<A[j - Increment])
A[j] = A[j - Increment];
else
break;
A[j] = Tmp;
}
cout << "the sorted number:" << endl;
for_each(A.begin(), A.end(), [](int val)//for_each加lambda表达式遍历vector
{
cout << val << " ";
});
}
int main()
{//输入示例81 94 11 96 12 35 17 95 28 58 41 75 15
int temp;
std::vector<int> nums;
cout << "please input number:" << endl;
while (cin >> temp)
{
nums.push_back(temp);
}
ShellSort(nums,nums.size());
return 0;
}
希尔排序最坏情况分析
定理3 使用希尔增量时希尔排序的最坏情形运行时间为θ(N^2)
定理4 使用Hibbard增量的希尔排序最坏情况运行时间为θ(N^3/2)
经实践运行效果好的Sedgewick序列9*4i-9*2i+1或者4i-3*2i+1。它们的实际效果比Hibbard序列还要好。
希尔排序的性能在实践中完全可接受,解释对于数以万计的N也如此,编程简单的特点使他成为对适当地大量输入数据经常选用的算法。