插入排序与希尔排序

来源:互联网 发布:率土之滨兵营升级数据 编辑:程序博客网 时间:2024/06/12 00:58
  • 插入排序

插入排序是基于减治法的一种排序算法,其思想是若对N个数进行排序,假设前N-1个数已经有序,只需要将最后一个元素插入到合适的位置即完成排序。

虽然思想更接近于使用递归,但是使用迭代却又更高的效率。

使用迭代来实现插入排序,首先将数组第一个元素当做一个有序队列,然后将第二个元素当做插入元素插入,插入第三个元素时,前面两个当做有序序列进行插入,然后依次顺推,直到最后一个元素完成插入。

下面是代码:

void insert_sort(vector<int> & a){    if(a.empty() || a.size() == 1)//若数组为空或者元素只有一个,直接返回    return;    for(int i=1;i<a.size();++i)//控制插入的元素的索引    {        int num=a[i]; //保存插入元素的值        int j=i-1;        for(;j>=0;j--)//从插入元素的前一个元素开始向前依次比较        {            if(a[j] > num )//若不满足条件,后移            a[j+1]=a[j];            else          //找到将要插入的位置            break;        }        a[j+1]=num;  //插入    }}

插入排序的代码相对简单一些,也可以发现,使用插入排序对比较有序的数列进行排序,有着相当高的效率。

  • 希尔排序

希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。

希尔排序的基本思想是:

把记录按步长 gap 分组,对每组记录采用直接插入排序方法进行排序。
随着步长逐渐减小,所分成的组包含的记录越来越多,当步长的值减小到 1 时,整个数据合成为一组,构成一组有序记录,则完成排序。

Shell排序可以看做是插入排序的一种扩展排序。
下面是我实现的Shell排序:

void shell_sort(vector<int> & a){    if(a.empty() || a.size() == 1)    return;    shell_sort(a,2);    shell_sort(a,1);}void shell_sort(vector<int>&a,int num){    for(int i=0;i<num;i++)    shell_sort(a,num,i);}void shell_sort(vector<int>& a,int num,int s){    for(int i=s + num;i<a.size();i+=num)    {        int n=a[i];        int j= i - num;        for(;j>=0;j-=num)        {            if(a[j]>n)            a[j+num]=a[j];            else            break;        }        a[j+num]=n;    }}

这上面有三个重载的函数,只有一个参数的函数是总的排序函数;有两个参数的函数,第二个参数代表增量,这个函数完成在该增量下的插入排序,最后的三个参数的函数的第三个参数代表插入排序的开始索引。

在这里我选择的增量为2,当然这个增量的选择看自己,这里我的实验代码的数组的大小只有6个元素,这个增量是可以接受的。

下面是实验代码:

int main(){    int b[6]={8,2,9,3,5,7};    vector<int> a;    for(int i=0;i<6;i++)    a.push_back(b[i]);    //  insert_sort(a);    shell_sort(a);    vector<int>::iterator p=a.begin();    for(;p!=a.end();++p)    cout<< *p<<" ";    cout<<endl;}

测试结果这里就不贴了,我的运行结果是正确的,你们可以试一下

0 0
原创粉丝点击