快速排序的实现是优美的,但是很不幸,我之前的实现非常差劲。参见《分治法:用C#实现快速排序》
今天,我用C++重写了一遍,精简代码,力求优美。
#include <iostream>
using namespace std;
int partition1(int* a, int l, int r)
{
int m = l;
for (int i = l; i < r - 1; i++) {
if (a[i] < a[r]) {
int temp = a[i];
a[i] = a[m];
a[m] = temp;
m++;
}
}
int temp = a[r];
a[r] = a[m];
a[m] = temp;
return m;
}
void quickSort(int* a, int l, int r)
{
if (l <= r) {
int q = partition1(a, l, r);
quickSort(a, l, q - 1);
quickSort(a, q + 1, r);
}
}
int main() {
int a[] = {4,66, 54, 3, 54,21, 31, 100, 9};
quickSort(a, 0, 8);
return 0;
}
接下来,在快速排序的基础上,进行少量的修改,让其在O(n)时间内,求出数组的前k个最小值。
只需要将上面的quickSort修改为:
void sortMinimum(int* a, int k, int l, int r)
{
if (l <= r) {
int q = partition1(a, l, r);
if (q < k) {
sortMinimum(a, k, q + 1, r);
}
}
}