c++实现的快速排序、堆排序、归并排序等排序算法全集
2018-07-20 来源:open-open
#include<stdio.h> #include<stdlib.h> struct node { int key; }r[20]; struct rnode { int key; int point; }; main() { void print(struct node a[20],int n); int creat(); void shell(struct node a[20],int n); int hoare(struct node a[20],int l,int h); void quick1(struct node a[20],int n); void quick2(struct node a[20],int l,int h); void heap(struct node a[20],int i,int m); void heapsort(struct node a[20],int n); void merges(struct node a[20],struct node a2[20],int h1,int mid,int h2); void mergepass(struct node a[20],struct node a2[20],int l,int n); void mergesort(struct node a[20],int n); int yx(int m,int i); int radixsort(struct rnode a[20],int n); int num,l,h,c; struct rnode s[20]; c=1; while(c!=0) { printf(" 主菜单 \n"); printf(" 1 输入关键字,以-9999表示结束。\n"); printf(" 2 希尔排序 \n"); printf(" 3 非递归的快速排序 \n"); printf(" 4 递归的快速排序 \n"); printf(" 5 堆排序 \n"); printf(" 6 归并排序 \n"); printf(" 7 基数排序 \n"); printf(" 输入选择 (1--7,0表示结束): "); scanf("%d",&c); switch(c) { case 1:num=creat();print(r,num);break; case 2:shell(r,num);print(r,num);break; case 3:quick1(r,num);print(r,num);break; case 4:l=0;h=num-1;quick2(r,l,h); printf("output quick2sort result:\n"); print(r,num);break; case 5:heapsort(r,num);break; case 6:mergesort(r,num);print(r,num);break; case 7:radixsort(s,num); } } }//main end void print(struct node a[20],int n) { int i; for(i=0;i<n;i++) printf("%5d",a[i ].key); printf("\n"); }//print end int creat() { int i,n; n=0; printf("input keys"); scanf("%d",&i); while(i!=-9999) { r[n].key=i; n++; scanf("%d",&i); } return(n); }//creat end void shell(struct node a[20],int n)//希尔排序 { int i,j,k; for(i=n;i>=1;i--) a[i].key=a[i-1].key; k=n/2; while(k>=1) { for(i=k+1;i<=n;i++) { a[0].key=a[i].key; j=i-k; while((a[j].key>a[0].key)&&(j>=0)) { a[j+k].key=a[j].key; j=j-k; } a[j+k]=a[0]; } k=k/2; } for(i=0;i<n;i++) a[i].key=a[i+1].key; printf("输出希尔排序的结果:\n"); }//shell end ////////////////////快速排序/////////////////////////// int hoare(struct node a[20],int l,int h)//分区处理函数 { int i,j; struct node x; i=l; j=h; x.key=a[i].key; do { while((i<j)&&(a[j].key>=x.key)) j--; if(i<j) { a[i].key=a[j].key; i++; } while((i<j)&&(a[i].key<=x.key)) i++; if(i<j) { a[j].key=a[i].key; j--; } }while(i<j); a[i].key=x.key; return(i); }//hoare end void quick1(struct node a[20],int n) { int i,l,h,tag,top; int s[20][2]; l=0;h=n-1;tag=1;top=0; do { while(l<h) { i=hoare(a,l,h); top++; s[top][0]=i+1; s[top][1]=h; h=h-1; } if(top==0) tag=0; else { l=s[top][0]; h=s[top][1]; top--; } }while(tag==1); printf("输出非递归快速排序结果:\n"); }//quick end void quick2(struct node a[20],int l,int h)//递归的快速排序 { int i; if(l<h) { i=hoare(a,l,h); quick2(a,l,i-1); quick2(a,i+1,h); } }//quick2 end ////////////////////快速排序结束//////////////////////// ////////////////////堆排序函数////////////////////////// void heap(struct node a[20],int i,int m)//调整堆的函数 { struct node x; int j; x.key=a[i].key; j=2*i; while(j<=m) { if(j<m) if(a[j].key>a[j+1].key) j++; if(a[j].key<x.key) { a[i].key=a[j].key; i=j; j=2*i; } else j=m+1; } a[i].key=x.key; }//heap end void heapsort(struct node a[20],int n)//堆排序的主体函数 { int i,v; struct node x; for(i=n;i>0;i--) a[i].key=a[i-1].key; for(i=n/2;i>=1;i--) heap(a,i,n); printf("输出堆排序结果:\n"); for(v=n;v>=2;v--) { printf("%5d",a[1].key); x.key=a[1].key; a[1].key=a[v].key; a[v].key=x.key; heap(a,1,v-1); } printf("%5d",a[1].key); for(i=0;i<n;i++) a[i].key=a[i+1].key; }//heapsort end /////////////////堆排序函数结束/////////////////// //////////////////归并函数//////////////////////// void merges(struct node a[20],struct node a2[20],int h1,int mid,int h2) //归并排序的核心算法 { int i,j,k; i=h1;j=mid+1;k=h1-1; while((i<=mid)&&(j<=h2)) { k=k+1; if(a[i].key<=a[j].key) { a2[k].key=a[i].key; i++; } else { a2[k].key=a[j].key; j++; } } while(i<=mid) { k++; a2[k].key=a[i].key; i++; } while(j<=h2) { k++; a2[k].key=a[j].key; i++; } }//merges end void mergepass(struct node a[20],struct node a2[20],int l,int n) //一趟归并 { int j,i,h1,mid,h2; i=0; while((n-i)>=2*l) { h1=i; mid=h1+l-1; h2=i+2*l-1; merges(a,a2,h1,mid,h2); i=i+2*l; } if((n-i)<=l) for(j=i;j<=n;j++) a2[j].key=a[j].key; else { h1=i; mid=h1+l-1; h2=n-1; merges(a,a2,h1,mid,h2); } }//mergepass end void mergesort(struct node a[20],int n) { int l; struct node a2[20]; l=1; while(l<n) { mergepass(a,a2,l,n); l=2*l; mergepass(a2,a,l,n); l=2*l; } printf("输出归并排序的结果:\n"); }//mergesort end ///////////////归并函数结束/////////////// ///////////////基数排序/////////////////// int yx(int m,int i)//分离关键字倒数第i位有效数字的算法 { int x; switch(i) { case 1:x=m%10;break; case 2:x=(m%100)/10;break; case 3:x=(m%1000)/100;break; case 4:x=(m%10000)/1000;break; } return(x); }//yx end int radixsort(struct rnode a[20],int n) { int f[11],e[11],i,j,k,l,p,d,t; for(i=1;i<=n;i++) { a[i].key=r[i-1].key; a[i].point=i+1; } a[n].point=0; p=1; printf("输出关键字有效位数 d\n"); scanf("%d",&d); printf("输出基数排序的结果:\n"); for(i=1;i<=d;i++) { for(j=0;j<=10;j++) { f[j]=0; e[j]=0; } while(p!=0) { k=yx(a[p].key,i); if(f[k]==0) { f[k]=p; e[k]=p; } else { l=e[k]; a[l].point=p; e[k]=p; } p=a[p].point; } j=0; while(f[j]==0) j++; p=f[j];t=e[j]; while(j<10) { j++; while((j<10)&&(f[j]==0)) j++; if(f[j]!=0) { a[t].point=f[j]; t=e[j]; } } a[t].point=0; t=p; while(t!=0) { printf("%5d",a[t].key); t=a[t].point; } printf("\n"); } return(p); }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点!
本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。
上一篇:php获取当前页面的url地址
下一篇:朴素贝叶斯算法的python实现
最新资讯
热门推荐