算法思想:希尔排序是分组插入的方法。按照增量将数组分割成n组,在每一组中进行直接插入排序。然后改变增量大小,继续进行直接插入排序。最后的增量必须为1,就是所有记录在同一组进行直接插入排序。
算法优点:为什么要采用多分组呢?其实就是减少数据移动的次数,假设一个最小的元素排在最后,如果按照直接插入排序需要移动n-1次,这个代价很大。而按照希尔排序,可能只需要移动(n/增量)次。可以看出这种跳跃式移动的优势。特别是在n较大,排列无序,有很好的效果。
算法缺点:不能使用链式结构。排序方法不稳定,即有相同大小的元素不能保证排序前后的顺序是一样的。
#include <iostream>
using namespace std;
#include<stdio.h>
//希尔排序函数
int* shellsort(int original[100],int length)
{
int increment;//希尔增量
int i,j;//循环变量
for(increment=9;increment>=1;increment=increment-2)//增量可以随便选取,不过最后一次必须是1,所以最好取奇数
//在每一增量的子表中进行直接插入排序
for(i=1+increment;i<=length;i++)
{
if(original[i]<original[i-increment])
{
original[0]=original[i];//将较小的元素暂时存在original[0]中
for(j=i-increment;j>0&&original[0]<original[j];j=j-increment)
original[j+increment]=original[j];//将子表中后面的比较小元素大的元素后移一个增量,腾出空间供插入。
original[j+increment]=original[0];
}
}
return original;
}
int main()
{
int *original;
int paixu[100]={0};
original=new int[100];
int i,n;
paixu[0]=0;
for(i=1;i<100;i++)
{
scanf("%d",&paixu[i]);
if(getchar()=='\n')
break;
else
continue;
}
n=i;
original=shellsort(paixu,n);
printf("排序后的结果:\n");
//输出排序后的数组
for(i=1;i<=n;i++)
{
printf("%d ",original[i]);
}
printf("\n");
delete []original;
return 0;
}
CB下运行:
如果需要看到每一轮希尔排序后的到的结果,可以进行代码修改如下:
#include <iostream>
using namespace std;
#include<stdio.h>
//希尔排序函数
int* shellsort(int original[100],int length)
{
int increment;//希尔增量
int i,j,k;//循环变量
int n=1;
for(increment=9;increment>=1;increment=increment-2)//增量可以随便选取,不过最后一次必须是1,所以最好取奇数
{
//在每一增量的子表中进行直接插入排序
for(i=1+increment;i<=length;i++)
{
if(original[i]<original[i-increment])
{
original[0]=original[i];//将较小的元素暂时存在original[0]中
for(j=i-increment;j>0&&original[0]<original[j];j=j-increment)
original[j+increment]=original[j];//将子表中后面的比较小元素大的元素后移一个增量,腾出空间供插入。
original[j+increment]=original[0];
}
}
cout<<"第"<<n<<"轮希尔排序后数组排列情况:";
for(k=1;k<=length;k++)
{
printf("%d ",original[k]);
}
cout<<endl;
n++;
}
return original;
}
int main()
{
int *original;
int paixu[100]={0};
original=new int[100];
int i,n;
paixu[0]=0;
for(i=1;i<100;i++)
{
scanf("%d",&paixu[i]);
if(getchar()=='\n')
break;
else
continue;
}
n=i;
original=shellsort(paixu,n);
printf("排序后的结果:\n");
//输出排序后的数组
for(i=1;i<=n;i++)
{
printf("%d ",original[i]);
}
printf("\n");
delete []original;
return 0;
}
运行结果如下:
参考资料:严蔚敏《数据结构》
欢迎指正交流。