| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 685 人关注过本帖
标题:快速排序 ,为什么出现相同的数就不出结果了
只看楼主 加入收藏
CYdy
Rank: 2
等 级:论坛游民
帖 子:9
专家分:12
注 册:2014-12-22
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:8 
快速排序 ,为什么出现相同的数就不出结果了
#include<stdio.h>
void swap(int *p1,int*p2)
{
    int p;
    p=*p1;
    *p1=*p2;
    *p2=p;
}
void Quick_Sort(int a[],int start,int end)
{
    int pos;
    if(start<end)
        {
            pos=pro(a,start,end);
            Quick_Sort(a,start,pos-1);
            Quick_Sort(a,pos+1,end);
        }
}
int pro(int a[],int low,int high)
{
    int key=a[low],p,i;
    while(low!=high)
        {
            while(a[high]>key)
                high--;
            swap(&a[low],&a[high]);
            while(a[low]<key)
                low++;
            swap(&a[low],&a[high]);
        }
    a[low]=key;
    return low;
}
main()
{
    int a[10]={23,4,24,31,41,1,56,43,67,5};//当a[10]中存在相同的数就不出结果了
    int i;
    Quick_Sort(a,0,9);
    for(i=0;i<10;i++)
        printf("%d ",a[i]);
}
搜索更多相关主题的帖子: include start 
2015-01-04 18:33
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:5 
程序代码:
#include<stdio.h>

#define LEN 10

void QSort(int *a, int left, int right) {
    int i, j, val;

    if(left < right) {
        i = left;
        j = right;
        val = *(a + i);

        while(i < j) {
            while(i < j && *(a + j) > val) {
                j--; 
            }

            if(i < j) {
                *(a + i) = *(a + j);
                i++;
            }

            while(i < j && *(a + i) < val) {
                i++; 
            }

            if(i < j) {
                *(a + j) = *(a + i);
                j--;
            }
        }

        a[i] = val;
        QSort(a, left, i - 1); 
        QSort(a, i + 1, right);
    }
}


int main(void) {
    int i = 0, a[LEN] = {23, 41, 24, 31, 41, 24, 56, 43, 67, 5};
    QSort(a, 0, LEN - 1);

    for(; i < LEN; i++) {
        printf("%d ", a[i]);
    }

    printf("\n");
    return 0;
}

Only the Code Tells the Truth             K.I.S.S
2015-01-04 21:23
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:0 
看看谁的对
2015-01-04 21:37
CYdy
Rank: 2
等 级:论坛游民
帖 子:9
专家分:12
注 册:2014-12-22
收藏
得分:0 
回复 2楼 longwu9t
#include<stdio.h>
int pro(int a[],int low,int high)
{
    int key=a[low];
    while(low<high)
        {
            while(low<high&&a[high]>=key)
                high--;
            if(low<high)
                a[low++]=a[high];
            while(low<high&&a[low]<=key)
                low++;
            if(low<high)
                a[high--]=a[low];
        }
    a[low]=key;
    return low;
}
void Quick_Sort(int a[],int start,int end)
{
    int pos;
    if(start<end)
        {
            pos=pro(a,start,end);
            Quick_Sort(a,start,pos-1);
            Quick_Sort(a,pos+1,end);
        }
}
main()
{
    int a[10]={23,4,24,31,42,1,56,43,67,5};
    int i;
    Quick_Sort(a,0,9);
    for(i=0;i<10;i++)
        printf("%d ",a[i]);
}
你的和这个是一样的,我能看懂。这是我自己看快速排序思想敲出来的,我想知道这个是怎么错了。求帮忙,我就觉得是对的啊,可还是错的。
2015-01-04 22:20
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:3 
算法都是前人的智慧结晶
学习一门计算机语言不是说一定要把所有的算法都搞清
记住正确的就行了
也没必要重复发明轮子

长久下来
多多练习
自然就懂了

Only the Code Tells the Truth             K.I.S.S
2015-01-04 22:30
CYdy
Rank: 2
等 级:论坛游民
帖 子:9
专家分:12
注 册:2014-12-22
收藏
得分:0 
回复 5楼 longwu9t
受教了
2015-01-05 20:09
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:5 
再补充一个快速排序的代码 留做备用 与楼主的思路也更加一致
程序代码:
#include <stdio.h>
#define LEN 10

void swap(int *a, int *b) {
    int t = *a;
    *a = *b;
    *b = t;
}

int part(int *arr, int len) {
    int i = 0, idx = 0, val = *arr;
    swap(arr, arr + len - 1);

    for(; i < len; i++) {
        if(*(arr + i) < val) {
            swap(arr + i, arr + idx);
            idx++;
        }
    }

    swap(arr + len - 1, arr + idx);
    return idx;
}

void prt(int *arr, int len) {
    int i = 0;
    for(; i < len; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

void qSort(int *arr, int len) {
    int idx ;

    if(len > 1) {
        idx = part(arr, len);
        qSort(arr, idx);
        qSort(arr + idx + 1, len - idx - 1);
    }
}

int main(void) {
    int i = 0, arr[LEN] = {7, 4, 2, 5, 1, 5, 3, 1, 7, 6};
    /*
    for(; i < LEN; i++){
        scanf("%d", arr + i);
    }
    */
    qSort(arr, LEN);
    prt(arr, LEN);
    return 0;
}

Only the Code Tells the Truth             K.I.S.S
2015-01-05 20:52
zjkedy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:46
专家分:131
注 册:2010-5-14
收藏
得分:7 
死循环了,当a[high] == a[low],判断下面的条件,不停的swap
    while(low!=high)
        {
            while(a[high]>key)
                high--;
            swap(&a[low],&a[high]);
            while(a[low]<key)
                low++;
            swap(&a[low],&a[high]);
        }
2015-01-06 11:47
qidian123
Rank: 2
等 级:论坛游民
帖 子:19
专家分:34
注 册:2012-4-18
收藏
得分:0 
这个很麻烦了,估计是代码有点错误吧

www.jiajunyuanlin.com  www.futegz.comjtiao.com
2015-01-06 16:11
快速回复:快速排序 ,为什么出现相同的数就不出结果了
数据加载中...
 
   



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

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