| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 583 人关注过本帖
标题:快速排序的问题
只看楼主 加入收藏
ai8343512
Rank: 2
等 级:论坛游民
帖 子:75
专家分:94
注 册:2011-8-7
结帖率:100%
收藏
已结贴  问题点数:35 回复次数:9 
快速排序的问题
这段代码在我机子上组建没有问题,可运行后的结果是什么也没有,不知道为什么,麻烦大家看看到底是哪里出问题了?
程序代码:
# include <stdio.h>

void QuickSort(int *, int, int);
int FindPos(int *, int, int);

int main(void)
{
    int i;
    int a[8] = {2, 5, 3, 65, 43, 53, 24, 8};

    QuickSort(a, 0, 7);

    for (i=0; i<8; i++)
        printf("%d ", a[i]);
    printf("\n");

    return 0;
}

void QuickSort(int * a, int low, int high)
{
    int pos;

    while (low < high)
    {
        pos = FindPos(a, low, high);
        QuickSort(a, low, pos-1);
        QuickSort(a, pos+1, high);
    }
}

int FindPos(int * a, int low, int high)
{
    int val = a[low];
   
    while (low < high)
    {
        while (low<high && a[low]<=val)
            low++;
        while (low<high && a[high]>=val)
            high--;
    }

    return low;
}
搜索更多相关主题的帖子: 快速 
2012-01-16 21:04
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:5 
你没有交换数据位置

重剑无锋,大巧不工
2012-01-16 21:08
ai8343512
Rank: 2
等 级:论坛游民
帖 子:75
专家分:94
注 册:2011-8-7
收藏
得分:0 
回复 2楼 beyondyf
但是我现在把while循环的那一段改成
    while (low < high)
    {
        while (low<high && a[low]<=val)
            low++;
        a[high] = a[low];

        while (low<high && a[high]>=val)
            high--;
        a[low] = a[high];
    }
怎么还是什么都不显示?


[ 本帖最后由 ai8343512 于 2012-1-16 21:18 编辑 ]

思考不应该由他人来指导,会思考的人不需要你来提醒他去思考一个简单的问题。
2012-01-16 21:12
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
FindPos函数返回一个下标,QuickSort函数调用自身后也只是下标的不停转换,和排序有关系吗,没怎么弄懂你的手段和目的。

梅尚程荀
马谭杨奚







                                                       
2012-01-16 21:35
ai8343512
Rank: 2
等 级:论坛游民
帖 子:75
专家分:94
注 册:2011-8-7
收藏
得分:0 
回复 4楼 有容就大
FindPos返回的是已经定型了的数据的下标,比如说4,3,5,1,2,7,6这7个数字,我通过FindPos函数就可让4放在第4号位,同时也传递了两个数据。
然后再用相同的原理将已经定型的数据左右两边数据各看成一组数据进行处理,这样就可以不断传递两个数据并不断确定第一个数的位置。
最后,所有的数都在相应的位置上了,也就完成了排序。

思考不应该由他人来指导,会思考的人不需要你来提醒他去思考一个简单的问题。
2012-01-16 21:57
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
程序代码:
void QuickSort(int * a, int from, int to)
{
    int i = from, j = to, t;
    while(i < j)
    {
        while(i < j && a[i] <= a[j]) i++;
        t = a[i]; a[i] = a[j]; a[j] = t;
        while(i < j && a[j] >= a[i]) j--;
        t = a[i]; a[i] = a[j]; a[j] = t;
    }
    if(i - 1 > from) QuickSort(a, from, i - 1);
    if(i + 1 < to) QuickSort(a, i + 1, to);
}

重剑无锋,大巧不工
2012-01-16 22:07
ai8343512
Rank: 2
等 级:论坛游民
帖 子:75
专家分:94
注 册:2011-8-7
收藏
得分:0 
回复 6楼 beyondyf
我懂你的方法,很好理解很实用,但我还是想知道为什么我的程序就输出不了?

思考不应该由他人来指导,会思考的人不需要你来提醒他去思考一个简单的问题。
2012-01-16 22:25
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:30 
我帮你改了下。
# include <stdio.h>

void QuickSort(int *, int, int);
int FindPos(int *, int, int);

int main(void)
{
    int i;
    int a[8] = {2, 5, 3, 65, 43, 53, 24, 8};

    QuickSort(a, 0, 7);

    for (i=0; i<8; i++)
        printf("%d ", a[i]);
    printf("\n");

    return 0;
}

void QuickSort(int * a, int low, int high)
{
    int pos;

    if (low < high)      //递归调用不能用while, 用while死循环。
    {
        pos = FindPos(a, low, high);
        QuickSort(a, low, pos-1);
        QuickSort(a, pos+1, high);
    }
}

int FindPos(int * a, int low, int high)
{
    int val = a[low];
   
    while (low < high)
    {
        
        while (low<high && a[high]>=val)    // 先从后面找比第VAL小的数
            high--;
        a[low]=a[high];                     // 移动
        while (low<high && a[low]<=val)    // 从前面再找比VAL大的数
            low++;
        a[high]=a[low];                    //  移动
    }
    a[low] = val;                         // 关键要在找到之后再次赋值,保证VAL不丢失。
    return low;
}


[ 本帖最后由 有容就大 于 2012-1-16 22:58 编辑 ]

梅尚程荀
马谭杨奚







                                                       
2012-01-16 22:56
ai8343512
Rank: 2
等 级:论坛游民
帖 子:75
专家分:94
注 册:2011-8-7
收藏
得分:0 
错误有三点:
①找到了位置,没有交换数据
②在递归时本身就相当于一个循环,无需其它循环语句来控制它循环下去
③这种快速排序法必须从高位开始,不能从低位开始移动

思考不应该由他人来指导,会思考的人不需要你来提醒他去思考一个简单的问题。
2012-01-17 08:59
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
这个排序有点特别啊,FindPos函数可以在找到合符要求的元素后直接移动,不需要互换。

梅尚程荀
马谭杨奚







                                                       
2012-01-17 09:20
快速回复:快速排序的问题
数据加载中...
 
   



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

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