2018年蓝桥杯c/c++ B组初赛(第九届)第五题-快速排序

5.快速排序。

以下代码可以从数组a[]中找出第k小的元素。

它使用了类似快速排序中的分治算法,期望时间复杂度是O(N)的。

请仔细阅读分析源码,填写划线部分缺失的内容。

题意:补全快速排序的算法。

分析:根据题意,就是找出数组中第k个元素,本题是想通过分治的原理进行查找,分治即是通过随机的某个数,将数组中比它大的换到右边,比它小的换到左边,再通过分别又一次的对左右边进行同样的处理,从而达到对数的排序。

   根据下面这段代码,易知是要找到数组a中第5个元素。


#include <stdio.h>

int quick_select(int a[], int l, int r, int k) {
    int p = rand() % (r - l + 1) + l;
    int x = a[p];     //随机产生一个范围是【l,r】的p,并将a【p】的值赋给X 
    {int t = a[p]; a[p] = a[r]; a[r] = t;}   //这里将a【p】与最后一个数交换,它为什么要这样做请看接下来的代码
    int i = l, j = r;   //首先把l和r赋值给i和j
    while(i < j) {   //程序用a【i】和a【j】分别从数组的两端向中间移动,每次的移动都会将比X小的数放在角标为i的地方,比X大的放在角标为j的地方
        while(i < j && a[i] < x) i++;  //首先是从头开始往后移动,找出比X大的数(这个数要放在后面)
        if(i < j) {    // 先进行第一次的分析,后面的循环分析是一样的
            a[j] = a[i];   // 在进行第一次将前面比X大的数换到j的位置时,不用担心数组中最后一个元素被替换,因为X已经保存了这个元素
            j--;           //(而在后面几次这里的循环中你会发现这个值被替换前,这个值已经放到其它位置上
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值