问题描述:
求解在n个数当中找第k小元素问题
问题求解:
解法一:分治法
通过分治法查找数组中的元素我们很容易联想到常用的快速排序算法,每次快速排序时,需要将数组一分为二,将枢轴元素小的放在其左边,否则放右边,显然,枢轴的位置就是排序后的最终位置,并且不再发生改变。因此,快速排序的核心思想就在于将每个区间中的枢轴元素放在其对应的索引位置,而这个索引就是我们所要查找的k。
实现代码如下所示:
#include <cstring>
#include "iostream"
using namespace std;
//查找数组第k小的元素
//分治法快速排序求解
int partition(int arr[], int low, int high) {
int pivot = arr[low];
while (low < high) {
while (low < high && arr[high] >= pivot) high--;
arr[low] = arr[high];
while (low < high && arr[low] <= pivot) low++;
arr[high] = arr[low];
}
arr[low] = pivot;
return low;
}
int quickSortSolve(int arr[], int low, int high, int k) {
if (low < high) {
int pivot = partition(arr, low, high);
if (pivot == k) {
return arr[k];
} else if (pivot > k) {
return quickSortSolve(arr, low, pivot - 1, k);
}
return quickSortSolve(arr, pivot + 1, high, k);
}
return arr[low];
}
const int N = 10005;
int main() {
//数组大小n,查找的k
int n, k, arr[N];
memset(arr, 0, sizeof arr);
cin >> n;
for (int i = 0; i < n; ++i) {
cin >> arr[i];
}
cin >> k;
cout << quickSortSolve(arr, 0, n - 1, k - 1);
return 0;
}
运行结果: