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--; //(而在后面几次这里的循环中你会发现这个值被替换前,这个值已经放到其它位置上

最低0.47元/天 解锁文章





