2、快速查找數(shù)組中的第 K 小的數(shù)字 方法一:可以全部排序,然后找到第k 個數(shù),用STL自帶的sort,或者直接寫排序算法進行排序 方法二:類似于二分法,不斷縮小排序的規(guī)模,知道第 K 個最小的數(shù)字,參見July的 編程之法 下面的這種快速選擇排序始終只對一邊的數(shù)組進行遞歸排序,最壞也就是O(n),
#include<iostream>#include<string>#include<algorithm>usingnamespacestd;//right 是數(shù)組的最后一個元素 等于 n-1int median3(int a[], int left, int right)
//下面的快速排序算法實現(xiàn)之一,及通過三數(shù)取中分割法尋找最小的k個數(shù)的快速選擇SELECT算法都要調(diào)用這個median3函數(shù)
{int center;center = (left + right) / 2;if (a[left] > a[center])swap(a[left], a[center]);if (a[left] > a[right])swap(a[left], a[right]);if (a[center] > a[right])swap(a[center], a[right]);/* invariant: a[left] <= a[center] <= a[right] */swap(a[center], a[right - 1]); /* hide pivot ,pivot 放在了倒數(shù)第二個元素*/return a[right - 1]; /* return pivot */
}void insert_sort(intarray[], int left, int loop_times)
{for (int j = left; j < left + loop_times; j++){int key = array[j];int i = j - 1;while (i>left && array[i]>key){array[i + 1] = array[i];i--;}array[i + 1] = key;}
}void quick_sort(int s[], int k, int left, int right)
{int i, j;int pivot;if (left < right){pivot = median3(s, left, right);cout <<" "<< pivot << endl;for (int ii = 0; ii < 20; ++ii)cout << " " << s[ii];cout<< endl;i = left;j = right - 1;for (;;){while (s[++i] < pivot) {}while (s[--j] > pivot){}if (i < j){swap(s[i], s[j]);}else{break;}}swap(s[i], s[right - 1]); //交換相應(yīng)的主元,把s[i] 放到了倒數(shù)第二個元素位置cout << "i " << i << " j " << j << endl;if (k <= i){quick_sort(s, k, left, i - 1);}elseif (k > i + 1){quick_sort(s, k, i + 1, right);} }else{insert_sort(s,left, right - left + 1);}
}