寻找第K个数字
大致题意: 给出一个含有任意数字的序列, 找出其中升序排列下第k个数字.
升序排列下第k个数字, 可以视为在数组中第k - 1个位置上的值. 使用快速排序的思想, 针对每轮快速排序的子过程, 判断k是在左区间还是在右区间, 递归到最后时, 只会剩下一个位置就是第k个数字.
1 #include <iostream> 2 #include <vector> 3 4 using namespace std; 5 6 vector<int> nums; 7 8 int find_k(vector<int>& arr, int left, int right, int k) { 9 if (left >= right) { 10 return nums[k]; 11 } 12 int x = arr[left + (right - left) / 2]; 13 int i = left - 1, j = right + 1; 14 while (i < j) { 15 do { 16 i++; 17 } while (arr[i] < x); 18 do { 19 j--; 20 } while (arr[j] > x); 21 if (i < j) { 22 swap(arr[i], arr[j]); 23 } 24 } 25 if (k <= j) { 26 return find_k(arr, left, j, k); 27 } else { 28 return find_k(arr, j + 1, right, k); 29 } 30 } 31 32 int main(int argc, char* argv[]) 33 { 34 int n, k; 35 cin >> n >> k; 36 nums.resize(n); 37 for (int i = 0; i < n; ++i) { 38 cin >> nums[i]; 39 } 40 cout << find_k(nums, 0, n - 1, k - 1) << endl; 41 return 0; 42 }

浙公网安备 33010602011771号