希尔排序和插入排序

来源:互联网 发布:淘宝上买卫生巾靠谱吗 编辑:程序博客网 时间:2024/06/05 02:07
//第7章,排序#include <iostream>#include <vector>using namespace std;const int N=6;int A[N]={34,8,64,51,32,21} ;void insertion_sort(int A[],int n){int j,p;for(p=1;p<N;p++){int tmp=A[p];for(j=p;j>0&&A[j-1]>tmp;j--)A[j]=A[j-1];A[j]=tmp;}}//插入排序的分析:平均情形O(N^2)//情况是这样的,因为交换两个不按原序排列的相邻元素恰好消除一个逆序,而一个排好序的数组没有逆序。int b[13]={81,94,11,96,12,35,17,95,28,58,41,75,15};void shell_sort(int A[],int n){int i,j,increment;for(increment=n/2;increment>0;increment/=2){//对hk个子数组分别进行插入排序 //第一个子数组是{A[0],A[increment],A[incement*2],...} for(i=increment;i<n;i++){int tmp=A[i];for(j=i;j>=increment;j-=increment)//找到合适的插入位置if(tmp<A[j-increment])A[j]=A[j-increment];else break;A[j]=tmp;}} }  //使用希尔增量时,希尔排序的最坏情形分析是O(N^2);使用Hibbard增量时,希尔排序的最坏情形为O(N^(3/2));Hibbard增量形如:1,3,7,。。。,2^k-1  //希尔排序使用一个序列h1,h2,...,ht,即增量序列。只要h1=1,任何增量序列都是可行的 //在使用增量hk进行一趟排序后,对任意i有A[i]<=A[i+hk];所有相隔hk的元素都被排序 //其实,一趟hk排序就是对hk个独立的子数组执行一次插入排序 int main(){insertion_sort(A,N);for(int i=0;i<N;i++)cout<<A[i]<<'\t';shell_sort(b,13);cout<<endl;for(int i=0;i<13;i++)cout<<b[i]<<' ';}

0 0