2020-01-31

快速排序分治算法找出无序数列中的第k大的数

语言:c语言
起因:yy拿了道竞赛题给我,我虽然害怕做不出来,但是又想学,那就试吧
用时:我用了3小时(看懂了别人的讲解和答案…哭(´;︵;`))
以下代码可以从数组a[]中找出第k小的元素。

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

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

#include

int quick_select(int a[], int l, int r, int k) {
int p = rand() % (r - l + 1) + l;
int x = a[p];
{int t = a[p]; a[p] = a[r]; a[r] = t;}
int i = l, j = r;
while(i < j) {
while(i < j && a[i] < x) i++;
if(i < j) {
a[j] = a[i];
j–;
}
while(i < j && a[j] > x) j–;
if(i < j) {
a[i] = a[j];
i++;
}
}
a[i] = x;
p = i;
if(i - l + 1 == k) return a[i];
if(i - l + 1 < k) return quick_select( _____________________________ ); //填空
else return quick_select(a, l, i - 1, k);
}

int main()
{
int a[] = {1, 4, 2, 8, 5, 7, 23, 58, 16, 27, 55, 13, 26, 24, 12};
printf("%d\n", quick_select(a, 0, 14, 5));
return 0;
}
Step1.看此题代码毫无头绪,决定从分治算法开始入手。找到文章(看时跳过分部解析部分,容易理解)https://blog.csdn.net/MoreWindows/article/details/6684558?utm_source=app,singlemessage,singlemessage

Step2.于是自己照搬2020-01-31_第1张图片运行不出来(我开始怀疑题是不是有问题)yy第一次填的a l r k所有测试结果都是对的,但老师说不对
**暂时不知道为什么他这样填可以

Step3.yy看了我给的算法链接(还没搞懂的情况下)后,填的2020-01-31_第2张图片
看完我恍然大悟,正拍手叫好,他告诉我…第10个数以后就运行不出来了
我一试果然(我学到了测试数据应该全部用上! 这是个好习惯,严谨不随便!)
**暂时不知道为什么前9可以
Step4.(我又一次觉得题或者电脑有问题时)yy做出来了2020-01-31_第3张图片
嗯,特别好(要下次我也能动点脑子就更好了)

你可能感兴趣的:(笔记)