template< class Type > void Swap(Type a, Type b) { Type t; t = a; a = b; b = t; } template< class Type > int Partition( Type a[], int p, int r) //定位a[p]在升序排列的数组a[]中的位置的下标 { int i = p; int j = r + 1; Type x = a[p]; while (true) { while (a[++i] < x && i < r) ; while (a[--j] > x) ; if (i >= j) break; Swap(a[i], a[j]); } a[p] = a[j]; a[j] = x; return j; } template< class Type > int RandomizedPatition(Type a[], int p, int r) { srand(time(0)); int i = rand() % (r - p + 1); i += p; Swap(a[i], a[p]); return Partition(a, p, r); } template < class Type > void RandomizedQuickSort(Type a[], int p, int r) { if (p < r) { int q = RandomizedPatition(a, p, r); RandomizedQuickSort(a, p, q - 1); RandomizedQuickSort(a, q + 1, r); } } template < class Type > Type RandomizedSelect(Type a[], int p,int r,int k) { if (p == r) return a[p]; int i = RandomizedPatition(a, p, r); int j = i - p + 1; if (k < j) RandomizedSelect(a, p, i, k); else if(k > j) RandomizedSelect(a, i + 1, r, k - j); else return a[i]; }