#include<bits/stdc++.h>
using namespace std;
int Partition(int a[], int left, int right) { //一次快排
int pivot = a[left];
while (left < right) {
while (left<right && a[right]>pivot) {
right--;
}
a[left] = a[right];
while (left < right && a[left] <= pivot) {
left++;
}
a[right] = a[left];
}
a[left] = pivot;
return left;
}
void QuickSort(int a[], int left, int right) { //整体快排
if (left > right) return;
if (left < right) {
int p = Partition(a, left, right);
QuickSort(a, left, p - 1);
QuickSort(a, p + 1, right);
}
}
void swap_a(int a[], int x, int y) { //交换a[x]与a[y]的值
int temp = a[x];
a[x] = a[y];
a[y] = temp;
}
//注意用数组下标,因为快排是用数组下标
int select_min_k(int a[], int left, int right, int k) {
do {
int j = rand() % (right - left + 1) + left;
swap_a(a, left, j);
j = Partition(a, left, right);
if (k == j + 1) {
return j;
}
else if (k < j + 1) {
right = j;
}
else {
left = j + 1;
}
} while (1);
}
int main() {
int N;
cin >> N;
int a[10000] = {};
int i, j, temp;
for (i = 0; i < N; i++) {
cin >> a[i];
}
int k;
cin >> k;
if (k<1 || k>N) {
cout << "不存在第" << k << "小元素" << endl;
return 0;
}
int location = select_min_k(a, 0, N - 1, k);
cout << a[location] << endl;
return 0;
}
测试结果:

快速选择算法:找到数组中第k小元素的C++实现
1869

被折叠的 条评论
为什么被折叠?



