| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1395 人关注过本帖
标题:小弟我刚学C,帮我分析这个题
只看楼主 加入收藏
whseel
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2013-8-11
结帖率:0
收藏
已结贴  问题点数:20 回复次数:14 
小弟我刚学C,帮我分析这个题
#include<stdio.h>
int partition(int R[],int i,int j)
{
    int pivot=R[i];
    while(i<j)
    {
        while(i<j&&R[j]>=pivot)
            j--;
        R[i++]=R[j];
        while(i<j&&R[i]<=pivot)
            i++;
        R[j--]=R[i];
    }
    R[i]=pivot;
    return i;
}
void QuickSort(int R[],int low,int high)
{
    int pivotpos;
    if(low<high)
    {
        pivotpos=partition(R,low,high);
        QuickSort(R,low,pivotpos-1);
        QuickSort(R,pivotpos+1,high);
    }
}
void main()
{
    int i, a[]={9,6,8,7,0,1,3,2,4,5};
   
    QuickSort(a,0,9);
   
    for(i=0;i<10;i++)
        printf("%d ",a[i]);
}这里怎么错了,请大牛分析分析
搜索更多相关主题的帖子: include return 
2013-08-11 19:49
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:3 
代码又没注释,看起来就困了,把错误提示贴上来看看

思考赐予新生,时间在于定义
2013-08-11 19:55
whseel
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2013-8-11
收藏
得分:0 
这是一个关于排序的问题
2013-08-11 20:04
whseel
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2013-8-11
收藏
得分:0 
void main()
{
    int i, a[]={9,6,8,7,0,1,3,2,4,5};
   
    QuickSort(a,0,9);
   
    for(i=0;i<10;i++)
        printf("%d ",a[i]);
这个main函数是我加上去的,但是发现执行时会出问题
2013-08-11 20:08
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:3 
R[i++]=R[j];
R[j--]=R[i]
这两个赋值之前不要判断i<j吗?
2013-08-11 20:11
h13352825861
Rank: 2
来 自:中国
等 级:论坛游民
威 望:1
帖 子:39
专家分:72
注 册:2013-8-8
收藏
得分:3 
调试了一下,没有问题啊!!是逻辑错了么!还是你的编译器的问题!你用什么编译器!

相信汗水会让未来充满满了阳光!
2013-08-11 20:55
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
以下是引用whseel在2013-8-11 20:04:29的发言:

这是一个关于排序的问题

我知道这是快速排序,我意思是叫你把编译时提示的错误贴上来看看,如果今晚没人帮你解决,明天我再用电脑调试你的代码,给你答复

思考赐予新生,时间在于定义
2013-08-11 21:41
XiaoXiao_Ren
Rank: 3Rank: 3
来 自:西安
等 级:论坛游侠
威 望:1
帖 子:80
专家分:198
注 册:2013-7-17
收藏
得分:3 
回复 楼主 whseel
while(i<j&&R[j]>=pivot)
            j--;
        R[i++]=R[j];  //这里为什么是i++,这里无形中将i后移了一位,  直接修改为R[i]=R[j];

否极泰来
2013-08-11 23:08
may大象
Rank: 2
等 级:论坛游民
帖 子:55
专家分:38
注 册:2013-5-30
收藏
得分:3 
赞同8楼,把R[i++]改成R[i],R[i--]改成R[i].就可以排了

                             凡成大事者,各有各的方法论。
2013-08-11 23:53
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:0 
回复 9楼 may大象
从逻辑角度来讲,LZ程序真正的漏洞在于调用partition过程中,如果R[i]一开始就是最小的,那么执行while(i<j&&R[j]>=pivot) j--;这句时j就会等于i,此时就不需要进行交换了,因此执行R[i++]=R[j]之后再执行R[i]=pivot;就会导致错误,因此在两个赋值语句之前加一句if (i<j)就能避免

至于R[i++]=R[j]这个i的后移本来是无所谓的,因为第i个位置放入R[j]之后R[j]肯定不会再动了,所以i后移一位是没问题的,至于改了这个地方程序就能正确运行相当于是一个巧合掩盖了一个逻辑错误
2013-08-12 00:34
快速回复:小弟我刚学C,帮我分析这个题
数据加载中...
 
   



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

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