| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1070 人关注过本帖
标题:请教快速排序法的问题
只看楼主 加入收藏
tjxix
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2008-10-3
收藏
 问题点数:0 回复次数:5 
请教快速排序法的问题
书上有个例子,但其中有两句看不太明白,已在注释中说明,麻烦大家指点一下。谢谢!

//快速排序例子如下

#include <istream.h>

void qsort(int[],int,int);

void main()
{
        int a[]={55,2,6,4,32,12,9,73,26,37};
        int len=sizeof(a)/sizeof(int);
        qsort(a,0,len-1);
        for(int i=0;i<len;i++)
                cout<<a[i];
}
void qsort(int a[],int left,int right)
{
        int pivot,l,r,temp;
        l=left;
        r=right;
        pivot=a[(left+right)/2];
        ap=a[pivot]; /* */
        
        while(l<r)
        {
                while(a[l]<ap) ++l; /* */
                while(a[r]>ap) --r; /* */

                if(l>;=r) break;
               
                temp=a[l];
                a[l]=a[r];
                a[r]=temp;
                if(l!=pivot)--r;//这句和下面那句看不太明白,为啥是l不等于pivot的时候才--r?
                if(r!=pivot)++l;//和上句类同,为啥是r不等于pivot才执行++l啊?
        }
        if(l==r) l++;
        if(left<r) qsort(a,left,l-1);
        if(l<right) qsort(a,r+1,right);
}

// 想问一下,上面有注释所在的那两句中,执行++l和--r是不是为了避免遇到数组其他位置的元素等于a[pivot]时无法继续下去,不知道这样理解对吗?
// 但为什么要有l和r不等于pivot的条件?
// 谢谢!!


[[it] 本帖最后由 tjxix 于 2008-10-6 17:32 编辑 [/it]]
搜索更多相关主题的帖子: 快速排序 
2008-10-03 10:18
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
貌似你的程序很有问题,是个错误的程序。
因为你将数组下标和数组值进行了比较。我想本意应该pivot是数组的中间位置

倚天照海花无数,流水高山心自知。
2008-10-03 19:46
tjxix
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2008-10-3
收藏
得分:0 
[bo][un]nuciewth[/un] 在 2008-10-3 19:46 的发言:[/bo]

貌似你的程序很有问题,是个错误的程序。
因为你将数组下标和数组值进行了比较。我想本意应该pivot是数组的中间位置


改了一次还没改对,再次更正:
应该是前面加上一句:ap=a[pivot];/* */
后面那两句应该如下:
                while(a[l]<ap) ++l; /* */
                while(a[r]>ap) --r; /* */

还望大家指点最后有注释问题的那两句,谢谢!

[[it] 本帖最后由 tjxix 于 2008-10-6 17:35 编辑 [/it]]
2008-10-03 22:30
tianyi1988
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-10-4
收藏
得分:0 
我这里有一个你看一下
/*快速排序 */
void quicksort(int a[],int left ,int right)
{
    int i,j,x;
    
    if(left<right)
    {
        i=left;
        j=right;
        x=a[i];
        while(i<j)
        {
            while(i<j && a[j]>x) /*从右向左找第一个小于x的数 */
                j--;
            if(i<j)
                a[i++]=a[j];

            while(i<j && a[i]<x) /* 从左向右找第一个大于x的数 */
                i++;
            if(i<j)
                a[j--]=a[i];
        }
        a[i]=x;
        quicksort(a,left,i-1);
        quicksort(a,i+1,right);
    }
}
2008-10-05 20:29
tjxix
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2008-10-3
收藏
得分:0 
感谢ls的xd!
这个版本比我那书上思路清晰多了。
这个版本每轮比较的基值是取的最左端的元素。书上的是取中间位置的。如果我能把书上那个读懂就更好了。
谢谢!!

[[it] 本帖最后由 tjxix 于 2008-10-6 18:06 编辑 [/it]]
2008-10-06 17:59
missiyou
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:531
专家分:218
注 册:2007-10-9
收藏
得分:0 
pivot=a[(left+right)/2];
        ap=a[pivot]; /* */

这可能就你程序的问题,Pivot 是取得A组的元素。用元素计数器,明显就是问题。
你的思想我算明白了一点。其实应该是这句。pivot=(left+right)/2取一半,也就是中间的。
然后取得中元素。各一半遍历。在判断。呵呵,也倒是挺有意思的。应该也可以做出。呵呵。
2008-10-06 19:19
快速回复:请教快速排序法的问题
数据加载中...
 
   



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

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