一、问题描述
找到一个数组中第k大的数据;
使用分治法,参考快速排序的思想, 找原数组中找到一个枢纽元pivot, 将数组分为S1, pivot, S2; S1中的数据都是小于pivot, S2中的数据都是大于pivot;
如果pivot 就是第k个数组,直接返回;
如果S1中数据多于k, 第k个数据存在于S1, 递归调用S1;
如果k存在于S2, 第(k-pivot-S1)个数据就是解, 递归调用S2;
二、代码
快速选择问题的具体代码如下;
该算法时间复杂度是O(n), 因为每一次分治实际上只有一次递归调用;
#include <stdio.h>
#include <stdlib.h>
int partition(int* arr, int i, int j) {
int pivot = arr[i];
while (i < j) {
while (i < j && arr[j] >= pivot)
j--;
arr[i] = arr[j];
while (i < j && arr[i] <= pivot)
i++;
arr[j] = arr[i];
}
arr[i] = pivot;
return i;
}
void quickSelect(int* arr, int lo