在介绍希尔排序之前,我就不过多介绍冒泡排序,选择排序了,这两个排序在我看来就是在找最大最小值。
插入排序因为待会在希尔排序中会用到,所以我简单介绍一下,
插入排序算法思想:就是得到一个数后要插入一列已经排序好的数组中,以次比较,找到位置后放入即可。
算法步骤:
1、从第一个元素开始,该元素被认为已经被排序。(一个元素)
2、去除下一个元素,放入已经排序的数组中(从后向前扫描)
3、如果新元素小于数组中的元素,向前继续比较;如果新元素大于数组中的元素,说明他的位置在数组中的元素后一位。
#include<iostream>
#include <new>
int* InsertSort(int *a,int quantity)
{
for (int i=0;i<quantity;i++)
{
for(int j=i-1;j>=0;j--)
{
if(a[j+1]<a[j]) //如果后一个数比前一个数小,就交换两者位置
{
int temp = a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
else break;
}
}
return a;
}
int main()
{
using namespace std;
int quantity;
int *num;
cin>>quantity; //输入数组元素个数
num = new int[quantity];
for (int i;i<quantity;i++)
{
cin>>num[i];
}
num = InsertSort(num,quantity);
for(int i=0;i<quantity;i++)
{
cout<<num[i]<<" ";
}
return 0;
}
而希尔排序是由插入排序改进而来,希尔排序的有一个名称叫做缩小增量排序,由此可见,它和插入排序的区别在于,它并不是间隔一直为1的排序,而是有一个增量序列,说白了就是每一次排序弄一个间隔,然后分成几组数据进行排序。
算法步骤:
1、选择一个增量序列{t1,t2,t3,t4…tk},以次减小,最后一个一定是1。在实际应用中,可以选择增量从数组长度开始每次缩小一半作为增量。
2、进行k次排序,k为增量个数。
3、用直接插入排序。
int * HellSort(int*a,int quantity)
{
int gap = quantity/2;
while(gap>=1)
{
for (int i=0;i<quantity/gap;i++)
{
for(int j=i-1;j>=0;j--)
{
if(a[j+1]<a[j]) //如果后一个数比前一个数小,就交换两者位置
{
int temp = a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
else break;
}
}
gap=gap/2;
}
return a;
}
int main()
{
using namespace std;
int quantity;
int *num;
cin>>quantity; //输入数组元素个数
num = new int[quantity];
for (int i;i<quantity;i++)
{
cin>>num[i];
}
num = HellSort(num,quantity);
for(int i=0;i<quantity;i++)
{
cout<<num[i]<<" ";
}
return 0;
}
推荐个学习排序算法的博客。
https://www.cnblogs.com/onepixel/articles/7674659.html