| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 410 人关注过本帖
标题:快速排序
只看楼主 加入收藏
yu1543054075
Rank: 1
等 级:新手上路
帖 子:102
专家分:8
注 册:2015-4-30
结帖率:90.24%
收藏
 问题点数:0 回复次数:5 
快速排序
//使用快速排序的方法将如下数字进行由大到小的排序,数字分别为:45,68,12,32,7,85,456,258,123,357.
#include <stdio.h>
void qusort(int s[],int,int);
int main(void)
{
    int i,a[11]={0,45,68,12,32,7,456,258,85,123,357};
    qusort(a,1,10);
    for(i=1;i<=10;i++)
        printf("%d    ",a[i]);
    return 0;
}
void qusort(int s[],int low,int high)
{
    int i,j,t;
    if(low<high)
    {
        i=low;
        j=high;
        t=s[low];
        while(i<j)
        {
            while(i<j&&s[i]>t)
                i++;
            if(i<j)
            {
                s[j]=s[i];
                j--;
            }
            while(i<j&&s[j]<t)
                j--;
            if(i<j)
            {
                s[i]=s[j];
                i++;
            }
            s[i]=t;
        }
        qusort(s,low,i-1);
        qusort(s,i+1,high);
    }
}
//输出结果为:258    123    123     123     45        45        45    45     45
搜索更多相关主题的帖子: include return 
2015-05-01 11:14
erty1001
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:331
专家分:1433
注 册:2014-8-31
收藏
得分:0 
简单说说:
首先快速排序对于程序员来说更重要的是它的思路或者说算法,具体实现实际程序员并不关心
因为每个人都有自己的书写,语法习惯,讲起来也比较多样性
其次你的问题,我感觉应该是算法没规划好,快速排序这类型的算法 你要从简单的几个数或者就2个数开始,程序逐步跟踪调试,逐渐扩大,然后再写出经过层层检验的程序,你这里给出的程序,就没有这样的说明或者调试规范。所以很难帮到你。
第三,快速排序核心在于交换和分类,从你的结果来看 分类实现的不理想,估计应该是交换的地方有问题 还有重点的是边界值,边界问题的处理,这是程序员关注的核心,边界条件一定要加注释,加异常处理。如果简单随便的话,程序一旦出现问题,复查起来等于重写
2015-05-01 12:13
yu1543054075
Rank: 1
等 级:新手上路
帖 子:102
专家分:8
注 册:2015-4-30
收藏
得分:0 
谢谢,但是还是不太懂,不知那位大神可以为我详细讲解一下我的程序错在哪里,非常感谢
2015-05-01 13:52
U201010009
Rank: 3Rank: 3
等 级:论坛游侠
威 望:6
帖 子:73
专家分:178
注 册:2013-2-25
收藏
得分:0 
楼主你好,根据你代码的情况,你选择的快速排序算法大概是这个思路吧:
给出一个列数字,以第一个数为基准,第二个数开始向右查找,与基准数对比;同时在末尾向左查找,与基准数对比;其中,左边查找的数值若比基准值小则与右边查找的位置交换数值,否则查找下一位,右边查找的数值若比基准值大则与左边查找的位置交换数值,否则查找下一位。直到两边查找碰头。然后把第一个数插入碰头出,那么此时左边的数不小于基准值,右边的数不大于基准值。递归操作,得到最后从大到小的排列了。
根据这个算法编写如下代码,楼主可以看看(勉强写完,还没优化):
//快速排序算法(一)由大到小排列
#include <stdio.h>

//快速排序算法(一)函数
void quicksort_01(int num[], int left, int right);

int main(void)
{
    int i = 0, a[11]={0,45,68,12,32,7,456,258,85,123,357};
    quicksort_01(a,1,10);
    printf("快速排序后大到小顺序为:\n");
    for(i=1;i<=10;i++)
        printf("%d\t", a[i]);
    return 0;
}

//快速排序算法(一)函数
void quicksort_01(int num[], int left, int right)
{
    int i = left + 1, j = right;
    int tmp = 0;
    int s = num[left];

    if(i < j)
    {
        while(i < j)
        {
            //若左边找到比s小或者右边找到比s大的数值,就i,j数值交换
            if(num[i] < s || num[j] > s)
            {
                tmp = num[i];
                num[i] = num[j];
                num[j] = tmp;
            }
            while(num[i] >= s)//从左边找,不小于s的不变
            {
                i++;
                break;
            }
            while(num[j] <= s)//左边找一次,再从右边找,不大于s的不变
            {
                j--;
                break;
            }
        }

        //根据i和j查找,最后i和j碰头的情况确定递归
        if(i == j)//i x j查找,然后i和j重合
        {
            if(s <= num[j])//i和j重合时,刚好代表数值不小于s时
            {
                num[left] = num[j];
                num[j] = s;
                quicksort_01(num, left, j-1);
                quicksort_01(num, j+1, right);
            }
            else//i和j重合是,刚好代表数值小于s时
            {
                num[left] = num[j-1];
                num[j-1] = s;
                quicksort_01(num, left, j-2);
                quicksort_01(num, j, right);
            }
        }
        else//i j查找,然后变为j i的情况
        {
            num[left] = num[j];
            num[j] = s;
            quicksort_01(num, left, j-1);
            quicksort_01(num, j+1, right);
        }               
        
    }
}
2015-05-01 16:13
yu1543054075
Rank: 1
等 级:新手上路
帖 子:102
专家分:8
注 册:2015-4-30
收藏
得分:0 
是的,非常感谢楼上的朋友的解答
2015-05-01 16:22
helloUJS
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:168
专家分:731
注 册:2013-3-27
收藏
得分:0 
给一个看起来相对容易理解的代码:
#include <stdio.h>
void qusort(int s[],int,int);
void swap(int *x,int *y);
int main(void)
{
    int i,a[11]={0,45,68,12,32,7,456,258,85,123,357};
    qusort(a,0,10);
    for(i=1;i<=10;i++)
        printf("%d    ",a[i]);
    return 0;
}
void swap(int *x,int *y)  //交换数据
{int t;
 t=*x;*x=*y;*y=t;}
void qusort(int s[],int low,int high)
{
    int i,j,t;
    if(low<high)
    {
        t=low;
        for(i=low+1;i<=high;i++)
           if(s[i]>s[low])
              swap(&s[i],&s[++t]);
        swap(&s[low],&s[t]);  //s[low]~s[t-1]>=s[t]>=s[t+1]~s[high
        qusort(s,low,t-1);
        qusort(s,t+1,high);
     
    }
}
2015-05-01 21:44
快速回复:快速排序
数据加载中...
 
   



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

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