快速排序之美
快速排序的实现是优美的,但是很不幸,我之前的实现非常差劲。参见《分治法:用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);
}
}
}
浙公网安备 33010602011771号