标题:几种排序方法的比较
只看楼主
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
结帖率:94.74%
 问题点数:0 回复次数:25 
几种排序方法的比较
程序代码:
/***************************************************************************

        这几日经过众网友的鼓励,终于把快排弄得几近明白。不过还是有点小问题:
     在快排中,我把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);

                }
        }
}








                        
搜索更多相关主题的帖子: include stdio 运行 
2008-05-07 15:13
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
得分:0 
RE KLJ
main()
{
 int a[10],i,j,t,*p;
 printf("please input 10 numbers:\n");
 p=a;
 for(i=0;i<=9;i++)
 scanf("%d",p++);
 for(i=0;i<=8;i++)
 {
  p=a+i;
  for(j=i+1;j<=9;j++)
  if(*p<*(a+j))p=a+j;
  t=*p;
  *p=*(a+i);
  *(a+i)=t;
  }
  p=a;
  for(i=0;i<=9;i++)
  printf("%d",*p++);
  printf("\n");
}

爱上你 是 我的错  可是离 开  又舍不得  听着你为我写的歌     好难过
如果说 我说如果  我们还 能  重新来过   不去计 较 谁对谁错  会怎么做
2008-05-07 15:41
qinxinhai
Rank: 1
来 自:湖南长沙
等 级:新手上路
帖 子:237
专家分:0
注 册:2008-4-27
得分:0 
楼主的快排法看不懂啊
楼上的又是什么方法?
迷茫中

我秀我自己
2008-05-07 19:19
海纳百川
Rank: 1
来 自:湖北荆州
等 级:新手上路
帖 子:186
专家分:5
注 册:2007-10-2
得分:0 
我看不懂这些程序真是不懂

2008-05-07 21:40
windk
Rank: 1
来 自:北京联合大学
等 级:新手上路
帖 子:43
专家分:0
注 册:2008-5-4
得分:0 
冒泡法?
貌似这才是冒泡法。。。
    for(i=0; i<n; i++)//
    {
        for(j=n; j>i; j--)
        {
            if (a[j] > a[j-1])
            {
                min=a[j-1]; a[j-1]=a[j]; a[j]=min;
            }
        }
    }
2008-05-07 22:03
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
得分:0 
3#选择排序。鉴定完毕。

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-07 22:20
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
得分:0 
想起自己很早很早以前,觉得插入排序效率太低了(当时的书上只有这一种),然后经过N久的思考“发明”了一种排序,即每次选出最小的元素然后交换。因自觉是效率最高的方法而得意好久。呵呵,现在想起来挺幼稚的。
到了大学才知道自己一直使用的所谓“快速”的排序方法其实也是简单排序的一种,而且效率和插入排序是一样的。才认识到自己目光的短浅……

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-07 22:23
qinxinhai
Rank: 1
来 自:湖南长沙
等 级:新手上路
帖 子:237
专家分:0
注 册:2008-4-27
得分:0 
插入是最好的.
在乱排的情况下
插入的效率也最好

我秀我自己
2008-05-07 22:42
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
得分:0 
比较是一个周期的指令。而交换是三个以上的周期。
选择排序的比较是n^2,交换是n。
而插入排序的比较是n^2,交换是n^2。你说哪个比较优?

qsort也是使用选择排序作为小数组的排序方式。

插入排序,是在“相对比较有序”的情况下,才优的。

至于高效排序,请使用高效率的排序方法。

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-07 23:05
hjh10845
Rank: 1
来 自:火星
等 级:新手上路
帖 子:104
专家分:0
注 册:2008-3-31
得分:0 
..
书上都有的,拿出来是什么意思?

<接受者>? or <创造者>?
2008-05-07 23:05



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-212961-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.208117 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved