几种排序方法的比较
程序代码:
/*************************************************************************** 这几日经过众网友的鼓励,终于把快排弄得几近明白。不过还是有点小问题: 在快排中,我把V值定为*a或是数组的a[0],无法进行交换排序。还希望哪位高手 帮忙解释。 谢谢。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本程序经WIN-TC测试正常运行,其它编译器下如有不同,请修改后运行。 ***************************************************************************/ #include<stdio.h> #include<string.h> #define X {char c;while(c=getchar()!='\n');} #define N 100 #define Y {printf("共进行了%d次交换。",k);printf("请按任意键继续:\n");getch();} void jiaohuan(char *a,char *b) /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~交换函数*****/ { char t; t=*a; *a=*b; *b=t; } void maopao(char a[],int n) /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~冒泡法排序*****/ { int i,j,k=0; for(i=0;i<n;++i) for(j=i+1;j<n;++j) { if(a[i]<a[j]) jiaohuan(&a[i],&a[j]); ++k; puts(a); } Y; } void xuanzhe(char p[],int n) /*~~~~~~~~~~~~~~~~~~~~~~~~~~选择法排序*******/ { int i,j,k=0; char V; for(i=0;i<n;++i) { V=i; for(j=i+1;j<n;++j) { if(p[V]<p[j]) V=j; if(V!=i) { jiaohuan(&p[V],&p[i]); ++k; } puts(p); } } Y; } int kuaipai(char *a,int i,int j,int *k) /*~~~~~~~~~~~~~~快速排序函数*/ { char V; int I=i; int J=j; V=*(a+(i+j)/2); while(1) { while(i<J&&*(a+i)>V) i++; while(j>I&&*(a+j)<V) j--; if(i>j) break; if(i<j) { jiaohuan((a+i),(a+j)); puts(a); *k+=1; } i++; j--; } if(I<j) kuaipai(a,I,j,&k); if(i<J) kuaipai(a,i,J,&k); return k; } int caidan() { int i=0; do { system("cls"); printf("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" "这是一个小程序,专门测试各种排序方法。\n" "本程序以ascII降序排列。\n" "请输入您的选择:\n" "1.冒泡法;\n" "2.选择法;\n" "3.快排法;\n" "4.退出。\n"); scanf("%d",&i); X; if(i<0||i>4) { printf("您的输入错误,请重新输入。\n"); sleep(1); } } while(i<0||i>4); return i; } int shuru(char a[]) { int n; printf("请输入待排序的数据,enter结束输入:\n"); gets(a); n=strlen(a); return n; } int main(void) { char a[N]; int i,n,k; while(1) { i=caidan(); switch(i) { case 1: n=shuru(a); maopao(a,n); break; case 2: n=shuru(a); xuanzhe(a,n); break; case 3: k=0; n=shuru(a); kuaipai(a,0,n-1,&k); Y; break; case 4: exit(0); } } }