插入排序之之简单插入排序和希尔排序

来源:互联网 发布:银联手机支付api java 编辑:程序博客网 时间:2024/05/22 19:20
#include <iostream>using namespace std;void insert_sort(int a[],int n){for(int i=1;i<n;i++)//从第二个数开始{if(a[i]<a[i-1]){int j=i-1;int x=a[i];//待排序数a[i]=a[i-1];while(x<a[j])//只要前面的数大于待排序数,就不断向前移动{a[j+1]=a[j];j--;}a[j+1]=x;}}}int main(){int a[]={3,5,2,7,-1,1,0,4,8,-6};insert_sort(a,10);for(int i=0;i<10;i++)cout<<a[i]<<" ";cout<<endl;return 0;}

如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。


希尔排序:

基本思想:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。

在直接插入排序中略作修改:

#include <iostream>using namespace std;void shell_insert_sort(int a[],int n,int dk){for(int i=dk;i<n;i++){if(a[i]<a[i-dk])//只是把增量因子由1变为dk{int j=i-dk;int x=a[i];a[i]=a[i-dk];while(x<a[j]){a[j+dk]=a[j];j-=dk;}a[j+dk]=x;}}}void shell_sort(int a[],int n){int dk=n/2;while(dk>=1){shell_insert_sort(a,n,dk);dk=dk/2;}}int main(){int a[]={3,5,2,7,-1,1,0,4,8,-6};shell_sort(a,10);for(int i=0;i<10;i++)cout<<a[i]<<" ";cout<<endl;return 0;}
希尔排序时效分析很难,关键码的比较次数与记录移动次数依赖于增量因子序列d的选取,特定情况下可以准确估算出关键码的比较次数和记录的移动次数。目前还没有人给出选取最好的增量因子序列的方法。增量因子序列可以有各种取法,有取奇数的,也有取质数的,但需要注意:增量因子中除1 外没有公因子,且最后一个增量因子必须为1。希尔排序方法是一个不稳定的排序方法。




原创粉丝点击