几种排序方法的比较
程序代码:
/***************************************************************************
这几日经过众网友的鼓励,终于把快排弄得几近明白。不过还是有点小问题:
在快排中,我把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);
}
}
}









