标题:一个关于快排的问题。
只看楼主
tianyagzw
Rank: 1
等 级:新手上路
帖 子:4
专家分:2
注 册:2013-8-5
结帖率:0
已结贴  问题点数:20 回复次数:6 
一个关于快排的问题。
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <time.h>
#define N 100

void qsort(int *a,int n);
void quick(int *a,int left,int right);

int main()
{
    int arr[N],i;
   
    srand(time(NULL));
   
    for(i=0;i<N;i++)
        arr[i]=rand()/100;
        
    qsort(arr,N);
   
    for(i=0;i<N;i++)
        printf("%d ",arr[i]);
        
    system("pause");
    return 0;
}

void qsort(int *a,int n)
{
    quick(a,0,n-1);
}

void quick(int *a,int left,int right)
{
    int f,l,r,t,tem;
   
    l=left;
    r=right;
    f=a[(left+right)/2];        /****????????????******/
   
    while(l<=r)               
    {
        while(a[l]<f)  ++l;
        while(a[r]>f)  --r;
        
        if(l<=r)
        {
            t=a[l];
            a[l]=a[r];
            a[r]=t;
            ++l;
            --r;
        }
    }
   
    if(left<r) quick(a,left,l-1);
    if(l<right) quick(a,r+1,right);
    }
上面这段程序中这段程序
     f=a[(left+right)/2];        /****????????????******/
   
    while(l<=r)               
    {
        while(a[l]<f)  ++l;
        while(a[r]>f)  --r;
如果换成
f=(left+right)/2;
while(l<=r)
{
    while(a[l]<a[f]) ++l;
    while(a[r]>a[f]) --r;

再次运行排出来就接近乱序,,,,,,而原来的排出来就是正确的。
这两段应该没什么区别啊。。。。
求解。。。。
搜索更多相关主题的帖子: include system return 
2013-08-05 19:25
小小程序猿
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:1
帖 子:755
专家分:2785
注 册:2013-7-18
得分:10 
那肯定的啊

  f=a[(left+right)/2];表示的是f=数组a[]中的一个元素

f=(left+right)/2;表示f=上面的那个数组元素的下标

另外快速排序没必要那么麻烦吧

孤独与寂寞是催化一个人迅速成长的良药,没有之一
2013-08-05 19:35
tianyagzw
Rank: 1
等 级:新手上路
帖 子:4
专家分:2
注 册:2013-8-5
得分:0 
回复 2楼 小小程序猿
不是,你注意看,后面也相应的改了,把f改成a[f]了。
2013-08-05 19:39
小小程序猿
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:1
帖 子:755
专家分:2785
注 册:2013-7-18
得分:0 
以下是引用tianyagzw在2013-8-5 19:39:17的发言:

不是,你注意看,后面也相应的改了,把f改成a[f]了。


a [ 这里面计算的ok的,但是一定的确切的数,而不是变量 ]

如果我没记错的话,是这样的

孤独与寂寞是催化一个人迅速成长的良药,没有之一
2013-08-05 20:01
tianyagzw
Rank: 1
等 级:新手上路
帖 子:4
专家分:2
注 册:2013-8-5
得分:0 
回复 4楼 小小程序猿
可是,我在中间测试过
加了一段代码
int tem;
tem=a[(left+right)/2];

printf("%d %d",a[f],a[tem]);
system("pause");

结果输出的两个数都一样,也就是说tem=a[f]
2013-08-05 20:13
小小程序猿
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:1
帖 子:755
专家分:2785
注 册:2013-7-18
得分:0 
以下是引用tianyagzw在2013-8-5 20:13:36的发言:

可是,我在中间测试过
加了一段代码
int tem;
tem=a[(left+right)/2];

printf("%d %d",a[f],a[tem]);
system("pause");

结果输出的两个数都一样,也就是说tem=a[f]


,特意的又看里一下,确定了,赋初值时  a[不允许出现变量],引用时,可以

我的错

孤独与寂寞是催化一个人迅速成长的良药,没有之一
2013-08-05 20:43
netaa001
Rank: 2
等 级:论坛游民
帖 子:73
专家分:69
注 册:2013-8-5
得分:10 
寻找志同道合的一起学习C语言,愿意的进群:330809827。
2013-08-05 21:33



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




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

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