| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 482 人关注过本帖
标题:自己些的一个,快速排序,但是发现一个问题,求助高手帮忙解决
只看楼主 加入收藏
peanut_acer
Rank: 1
等 级:新手上路
帖 子:16
专家分:7
注 册:2009-8-12
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:8 
自己些的一个,快速排序,但是发现一个问题,求助高手帮忙解决
这是我些的一个快速排序,但是发现如果出现相同数就进入死循环了..... 高手帮忙指出错误所在....  谢谢
#include <stdio.h>
#define N 10
void change(int *p,int *q)
{
    int z;
    z=*p;
    *p=*q;
    *q=z;
}

int fast(int * b,int left,int right)
{
    int l=left,r=right;
    int point=left;
    while(l<r)
    {
        while(b[point]<b[r]) r--;
        change(&b[point],&b[r]);
        point=r;
        while(b[point]>b[l]) l++;
        change(&b[point],&b[l]);
        point=l;
        if(r==l)
        {
            fast(b,left,l);
            fast(b,r+1,right);
            
        }
    }
}


int outs(int *a,int n)
{
    int i;
    for(i=0;i<n;i++)
        printf("%d ",a[i]);
    printf("\n");    
}

int randin(int *p,int n)
{
    int i;
    srand(time(NULL));
    for(i=0;i<n;i++)
    {
        p[i]=rand()%100;
    }
}    

int main()
{
    int a[N];
    randin(a,N);    
    fast(a,0,N-1);
    outs(a,N);
}

fast.c.rar (749 Bytes)
搜索更多相关主题的帖子: 求改 
2009-08-12 10:32
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:3 
回复 楼主 peanut_acer

改了改你的,你看看吧。不明白再问~
程序代码:
void fast(int *b,int left,int right) 
{ 
    if (left >= right) return; 
 
    int l=left,r=right; 
    int point=b[left]; 
    while (1) 
    { 
        while(point>b[l]) l++; 
        while(point<b[r]) r--; 
        if (l>=r) break; 
        change(&b[l++],&b[r--]); 
    } 
    fast(b, left, r); 
    fast(b, r+1, right); 
}
2009-08-12 11:52
peanut_acer
Rank: 1
等 级:新手上路
帖 子:16
专家分:7
注 册:2009-8-12
收藏
得分:0 
帮我看下 改成这样为什么不可以 ....  谢谢了
 
int fast(int * b,int left,int right)
{
    int l=left,r=right;
    int point=left;
    while(l<r)
    {
        while(b[point]<=b[r]) r--;
        change(&b[point],&b[r]);
        point=r;
        while(b[point]>=b[l]) l++;
        change(&b[point],&b[l]);
        point=l;
        if(r==l)
        {
            fast(b,left,l);
            fast(b,r+1,right);
            
        }
    }
}
2009-08-12 20:22
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:1 
先序遍历二叉树

我就是真命天子,顺我者生,逆我者死!
2009-08-13 14:12
小栽栽
Rank: 1
等 级:新手上路
帖 子:10
专家分:3
注 册:2009-8-13
收藏
得分:0 
回复 楼主 peanut_acer

我是想问问你那个  srand(time(NULL));  是个什么函数?我是刚入门的呵呵~~
2009-08-13 14:34
peanut_acer
Rank: 1
等 级:新手上路
帖 子:16
专家分:7
注 册:2009-8-12
收藏
得分:0 
这个是一个随机取种函数....   srand(seed);
取得的数作为 rand()随机取数的种子.....
2009-08-13 16:02
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:3 
以下是引用peanut_acer在2009-8-12 20:22的发言:帮我看下 改成这样为什么不可以 ....  谢谢了 int fast(int * b,int left,int right) {     int l=left,r=right;     int point=left;     while(l<r)     {         while(b[point]<=b[r]) r--;          ...
你編的这个,这句就有点问题:while(b[point]<=b[r]) r--; 如果刚进去的时候,本身最小的数就在第一个的话,那括号里的条件不是始终成立?r有可能一直减到小于0。之后还交换什么的,肯定会出错的。
2009-08-13 16:50
ljc_zy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:56
专家分:131
注 册:2009-7-14
收藏
得分:3 
问题多多。
1、while(b[point]<=b[r]) r--;  
2、while(b[point]>=b[l]) l++;   (<= 或>= ,只能有一边成立)
3、每个while循环结束后加判断 if(l>=r) break;
4、因为你没有加
if(left>=right) return;
所以下面这个
        if(r==l)  
        {  
            fast(b,left,l);  
            fast(b,r+1,right);  
              
        }
放在循环体里面有问题。
反正问题多多拉,建议把算法思想认真看下。

恋恋花事 www.
2009-08-14 09:48
快速回复:自己些的一个,快速排序,但是发现一个问题,求助高手帮忙解决
数据加载中...
 
   



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

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