据KNUTH证明,此方法是线性的。。。不理解。。。 #include <stdio.h> #include <time.h> #include <stdlib.h> #include <assert.h> #define N 10 void Swap( int * a, int * b) { int tmp = *a; *a = *b; *b = tmp; } int Partion(int a[], int n, int k) { Swap(a[0], a[k]); int last = 0; for (int i = 1; i < n; ++ i) { if (a[i] < a[0]) { Swap(a[i], a[++ last]); } } Swap(a[0], a[last]); return last; } void QuickSelect(int a[], int n, int kth) { Swap(a[0], a[n/2]); int left = 0, nelems = n; while (true) { int pos = Partion(a + left, nelems, nelems/2); if (pos + left == kth) break; if (pos + left > kth) nelems = pos; else left += pos + 1; } } int main() { srand(time(NULL)); int a[N] = {0 }; int i = 0; for ( ; i<N; ++i) a[i] = rand() % (N*10); QuickSelect(a, N, 5); printf("%d", a[4]); for ( i=0 ; i<N; ++i) printf("%d ", a[i]); printf("/n"); return 0; } 另:快排代码 int Partion(int a[], int left, int right) { std::swap(a[left], a[(left + right) / 2]); int last = left; for (int i = last + 1; i < right; ++ i) { if (a[i] < a[left]) { std::swap(a[i], a[++ last]); } } std::swap(a[left], a[last]); return last; } void QuickSort(int a[], int left, int right) { if (left < right) { int pos = Partion(a, left, right); QuickSort(a, left, pos); QuickSort(a, pos + 1, right); } }