希尔排序由Shell在1959年发明,又叫缩小增量排序,是第一个突破O(n^2)的排序算法,属于简单插入排序的改进版,会优先比较距离较远的元素。
- 算法步骤:
- 选择一个增量序列T1,T2,…,Tk, 其中Ti>Tj,Tk=1, i>j;
- 每趟排序,根据对应的增量Ti,将待排序列分割成若干子序列,分别对各子序列进行直接插入排序;
- 按增量序列个数k,对序列进行k趟排序。
- 希尔排序实例:
下图的增量序列为:5,2,1,第一趟排序将增量为5的子序列进行插入排序,第二趟排序将增量为2的子序列进行插入排序,第三趟将增量为1的子序列进行插入排序,最终完成排序
代码实现
#include <iostream>
using namespace std;
int a[] = {
70,30,40,10,80,20,90,100,75,60,45};
void shell_sort(int a[],int n);
int main()
{
cout<<"Before Sort: ";
for(int i=0; i<11; i++)
cout<<a[i]<<" ";
cout<<endl;
shell_sort(a, 11);
cout<<"After Sort: ";
for(int i=0; i<11; i++)
cout<<a[i]<<" ";
cout<<endl;
system("pause");
}
void shell_sort(int a[], int n)
{
int gap;
for(gap = 3; gap >0; gap--)
{
for(int i=0; i<gap; i++)
{
for(int j = i+gap; j<n; j=j+gap)
{
if(a[j]<a[j-gap])
{
int temp = a[j];
int k = j-gap;
while(k>=0&&a[k]>temp)
{
a[k+gap] = a[k];
k = k-gap;
}
a[k+gap] = temp;
}
}
}
}
}