#include #include #include #include using namespace std; inline void swap(int &a, int &b) { int t = a; a = b; b = t; } int partition(vector& work, vector& indices, int p, int q) { // use work[q] to partition the array const int x = work[q]; int i = p-1; for (int j = p; j < q; j++) { if (work[j] < x) { i++; swap(work[i], work[j]); swap(indices[i], indices[j]); } } i++; swap(work[i], work[q]); swap(indices[i], indices[q]); return i; } int find_kthsmallest(const vector& A, int k) { const int n = A.size(); assert((k >= 0) && (k < n)); int p = 0, q = n-1; vector work(A), indices; for (int i = 0; i < n; i++) indices.push_back(i); while (p < q) { int r = partition(work, indices, p, q); if (r-p == k) return indices[r]; else if (r-p < k) { p = r+1; k -= (r-p+1); } else q = r-1; } return indices[p]; } ostream& operator<& A) { for (int i = 0; i < A.size()-1; i++) cout << A[i] << ' '; cout << A[A.size()-1]; return os; } int main(int argc, char** argv) { const int n = argc-2; vector A; for (int i = 2; i <= n+1; i++) A.push_back(atoi(argv[i])); const int k = atoi(argv[1]); cout << A << endl; cout << k << "th smallest element is: "; int pos = find_kthsmallest(A, k-1); cout << A[pos] << " at " << pos << endl; return 0; }
请问你的程序里面第k小,是从多少开始的? 第一个是k 为0还是k为1 这个partition返回的r是index吧? 如果k 的最小值为 1,就是最小的值 这句话不对吧? int r = partition(work, indices, p, q); if (r-p == k) return indices[r]; 个人觉得应该是 if (r-p+1 == k) return indices[r];
【在 p*i 的大作中提到】 : #include : #include : #include : #include : using namespace std; : inline void swap(int &a, int &b) { : int t = a; a = b; b = t; : } : int partition(vector& work, vector& indices, int p, int q) { : // use work[q] to partition the array
p*i
7 楼
main里面k从1开始,符合人的习惯 int pos = find_kthsmallest(A, k-1); 其它函数都是c++默认的从0开始,符合语言本身习惯 虽然这样没有必要。
【在 g***j 的大作中提到】 : 请问你的程序里面第k小,是从多少开始的? 第一个是k 为0还是k为1 : 这个partition返回的r是index吧? : 如果k 的最小值为 1,就是最小的值 : 这句话不对吧? : int r = partition(work, indices, p, q); : if (r-p == k) return indices[r]; : 个人觉得应该是 : if (r-p+1 == k) return indices[r];