寻找第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 }

 

posted @ 2025-03-16 22:36  r4him  阅读(14)  评论(0)    收藏  举报