概述
排序思路
希尔排序是一种分组插入排序。先取定一个小于n的整数d1作为第一个增量,把表全部元素分成d1个组,所有相互之间距离为d1的倍数的元素放在一个组内。在各组之间进行插入排序;然后再取第二个增量d2(d2<d1)重复分组和排序的过程,直至所取的增量dt=1(dt<d(t-1)<……<d2<d1)。
举例:对于数组int a[10]={9,8,7,6,5,4,3,2,1,0};
d1=10/2=5
{9,4},{8,3},{7,2},{6,1},{5,0}
代码实现
取d1=n/2,
#include <iostream>
using namespace std;
void shellSort(int a[],int n)
{
int gap,tmp,j,i;//gap代变每次取的增量
gap=n/2;
while(gap>0)//gap最小为1
{
//就是直接插入方法,只是这里gap作为间距
for(i=gap; i<n; i++)
{
tmp=a[i];
j=i-gap;
while(j>=0&&tmp<a[j]){
a[j+gap]=a[j];
j=j-gap;
}
a[j+gap]=tmp;
}
gap=gap/2;
}
}
int main()
{
int a[]={9,8,7,6,5,4,3,2,1,0};
shellSort(a,10);
for(int i=0;i<10;i++){
cout << a[i]<<",";
}
cout<< endl;
return 0;
}
算法分析
目前希尔排序的增量选区没有定论,但是保证最后一个增量必须等于1。希尔排序算法的时间复杂度难以分析,一般认为其平均时间复杂度为
希尔排序优于直接插入排序的原因:对于直接插入排序有两点可以提升性能
- 如果直接插入排序的初态基本有序时,直接插入排序比较和移动的次数较少
- 当n的值较小时,n和差别也较小。
希尔排序通过分组,使开始排序每组内直接插入排序的n比较小,满足第二条;到后面增量减小,组内n增大后,组内元素已经接近有序状态。满足第一条
希尔排序是一种不稳定的排序算法。
最后
以上就是仁爱毛豆为你收集整理的插入排序—希尔排序的全部内容,希望文章能够帮你解决插入排序—希尔排序所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复