原题链接:[蓝桥杯][算法提高]快速排序

题目描述:用递归来实现快速排序(quick sort)算法。快速排序算法的基本思路是:假设要对一个数组a进行排序,且a[0] = x。首先对数组中的元素进行调整,使x放在正确的位置上。同时,所有比x小的数都位于它的左边,所有比x大的数都位于它的右边。然后对于左、右两段区域,递归地调用快速排序算法来进行排序。


最初写的程序如下:

#include

#include

void qsort(int *a, int low, int high);

int main()

{

    int N=10;

    int *a=(int *)malloc(sizeof(int)*N);

    int t;

    int i=0;

    scanf("%d", &t);

    while(t!=0 )

    {

       a[i++]=t;

       scanf("%d", &t);

    }

    int len=i; // 数组真正长度

    qsort(a,0,len-1);

    for(i=0;i<len;i++)

        printf("%d ",a[i]);

    free(a);

    return 0;

}


void qsort(int *a, int low, int high){

    if(low>=high) return;

    int key=a[low];

    int left=low, right=high;

    while(low<high)

    {

        while((low

        if(low<high)

        {

            a[low]=a[high];

            low++;

        }

        while((low<high)&&(a[low]<=key)) low++;   

       if(low<high)

        {

            a[high]=a[low];

            high--;

        }

    }

    a[low]=key;

    qsort(a,left,high-1);

    qsort(a,high+1,right); 

}

乍看起来非常完美,所以反复提交,不信邪地一遍又一遍运行,得到的结果依旧一样。实在找不到原因,花了89大洋买了刷题小能手,查看输出结果,终于找到原因。不是在快速排序那儿,而是在输入数据处。题干要求不超过10个数,没有做判断!!所以修改后代码如下(请注意红色部分):

#include

#include

void qsort(int *a, int low, int high);

int main()

{

    int N=10;

    int *a=(int *)malloc(sizeof(int)*N);

    int t;

    int i=0;

    scanf("%d", &t);

    while(t!=0 && i<N)

    {

       a[i++]=t;

       scanf("%d", &t);

    }

    int len=i; // 数组真正长度

    qsort(a,0,len-1);

    for(i=0;i<len;i++)

        printf("%d ",a[i]);

    free(a);

    return 0;

}


void qsort(int *a, int low, int high){

    if(low>=high) return;

    int key=a[low];

    int left=low, right=high;

    while(low<high)

    {

        while((low

        if(low<high)

        {

            a[low]=a[high];

            low++;

        }

        while((low<high)&&(a[low]<=key)) low++;   

       if(low<high)

        {

            a[high]=a[low];

            high--;

        }

    }

    a[low]=key;

    qsort(a,left,high-1);

    qsort(a,high+1,right); 

}



点赞(0)
 

0.0分

4 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论