各种排序算法
来源:互联网 发布:手机淘宝店铺二维码 编辑:程序博客网 时间:2024/05/02 05:03
/**四种插入排序(直接插入排序,折半插入排序,希尔排序)*/#include<stdio.h>#define N 8#define M 3void sort1(int a[N]);void sort2(int a[N]);void print(int a[N]);void sort3(int a[N]);void sort3two(int a[N],int delph);void sort4(int a[N]);void sort5(int a[N],int low ,int high);int sort5two(int a[N],int low,int high);void main(){int a[N]={5,6,3,9,1,7,2,4};sort1(a); //折半插入排序sort2(a); //直接插入排序sort3(a); //希尔排序 sort4(a); //冒泡排序 sort5(a,0,N-1); //快速排序 print(a); //打印}//////////////快速排序//////////////void sort5(int a[N],int low ,int high)//递归调用sort5Two()方法{ int pos; while(low<high) { pos=sort5two(a,low,high); sort5two(a,low,pos-1); sort5two(a,pos+1,high); }}int sort5two(int a[N],int low,int high)//排序核心{ int temp; temp=a[low]; while (low<high) { while(low<high&&a[high]>temp) high--;//左端查找小于temp的数,high停在此值上 if(low<high){a[low]=a[high];low++;}//将high指向的值赋给low,并将low后移 while(low<high&&a[low]<temp) low++; if(low<high){a[high]=a[low];high--;} } a[low]=temp; return low;}//////////////冒泡排序//////////////void sort4(int a[N]){int i,j,temp;for(j=N-1;j>0;j--)for(i=0;i<j;i++)if(a[i]>a[i+1]){temp=a[i];a[i]=a[i+1];a[i+1]=temp;}}//////////////直接插入排序//////////////void sort1(int a[N]){ int temp,i,j; for(i=1;i<N;i++) { temp=a[i]; j=i-1; while(j>0)//找出需要插入的位置 { if(a[j]>temp) { a[j+1]=a[j];//移动元素 j--; } else break; } //此时j指向小于temp的最后一个数 a[j+1]=temp; }}//////////////折半插入排序//////////////void sort2(int a[N]){ //int a[N]={1,4,5,6,3,9,5};int low,high,mid,temp;for(int i=1;i<N;i++){ low=0; high=i-1;mid=(low+high)/2; while(low<=high)//查找插入点,mid正好为插入点 {if(a[i]<a[mid]) high=mid-1;else low=mid+1; mid=(low+high)/2;} temp=a[i];for(int j=i-1;j>mid;j--)//移动mid后面的元素a[j+1]=a[j];a[mid+1]=temp;//将元素a[i]插到(mid+1)位置}}//////////////希尔排序//////////////void sort3(int a[N]){ int delph[M]={1,2,4}; for(int i=(M-1);i>=0;i++)//增量数组delph[M]的长度 { sort3two(a,delph[i]); } }void sort3two(int a[N],int delph)//delph是增量{int i,temp;for(i=0;i<(N-delph);i++) //经计算,当增量是delph时,有(N-delph)对数据需要比较{ //调换一对数据if(a[i]>a[i+delph]){ temp=a[i];a[i]=a[i+delph];a[i+delph]=temp;}}}//////////////打印函数//////////////void print(int a[N]){for(int i=0;i<N;i++)printf("%d ",a[i]);printf("\n");}