鱼C论坛

 找回密码
 立即注册
查看: 198|回复: 1

[已解决]快速选择算法

[复制链接]
发表于 2024-1-15 17:11:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. #define INF 0x3f3f3f3f
  5. typedef pair<int,int>pii;
  6. const int N=2e5+10;
  7. // 用快速选择算法
  8. int n,k;
  9. int q[N];
  10. int quick_sort(int l,int r,int k)
  11. {
  12.     if(l==r)return q[l];
  13.     int x=q[l],i=l-1,j=i+1;
  14.     while(i<j)
  15.     {
  16.         do i++;while(q[i]<x);
  17.         do j--;while(q[j]>x);
  18.         if(i<j)swap(q[i],q[j]);

  19.     }
  20.     int sl=j-l+1;// 左边区间有多少个数
  21.     if(k<=sl)return quick_sort(l,j,k);
  22.     return quick_sort(j+1,r,k-sl);


  23. }

  24. void solve()
  25. {
  26.     cin>>n>>k;
  27.     for(int i=0;i<n;i++)
  28.     {
  29.         cin>>q[i];
  30.     }
  31.     cout<<quick_sort(0,n-1,k)<<endl;
  32.    

  33. }
  34. int main()
  35. {
  36.     ios::sync_with_stdio(0);
  37.     cin.tie(0);
  38.     cout.tie(0);
  39.     int t;
  40.     t=1;
  41.     while(t--)
  42.     {
  43.         solve();
  44.     }

  45. }
复制代码

为什么会没有输出呢
最佳答案
2024-1-15 17:12:42
快速选择算法是一种用于在无序数组中寻找第k个最小元素的算法。它的思想类似于快速排序,通过将数组分成两部分,其中一部分比pivot元素小,另一部分比pivot元素大。然后根据pivot元素所在的位置,判断第k个最小元素在哪一部分,并对相应的部分进行递归处理。

以下是一个使用快速选择算法寻找第k个最小元素的示例代码:

  1. #include <iostream>
  2. using namespace std;

  3. int partition(int arr[], int low, int high) {
  4.     int pivot = arr[high];  // 选择最右边的元素作为pivot
  5.     int i = low - 1;
  6.    
  7.     for (int j = low; j < high; j++) {
  8.         if (arr[j] <= pivot) {
  9.             i++;
  10.             swap(arr[i], arr[j]);
  11.         }
  12.     }
  13.     swap(arr[i + 1], arr[high]);
  14.     return i + 1;
  15. }

  16. int quickSelect(int arr[], int low, int high, int k) {
  17.     if (low == high) {
  18.         return arr[low];
  19.     }
  20.    
  21.     int pivotIndex = partition(arr, low, high);
  22.     int rank = pivotIndex - low + 1;
  23.    
  24.     if (rank == k) {
  25.         return arr[pivotIndex];
  26.     } else if (rank < k) {
  27.         return quickSelect(arr, pivotIndex + 1, high, k - rank);
  28.     } else {
  29.         return quickSelect(arr, low, pivotIndex - 1, k);
  30.     }
  31. }

  32. int main() {
  33.     int arr[] = {3, 1, 5, 2, 4};
  34.     int n = sizeof(arr) / sizeof(arr[0]);
  35.     int k = 2;  // 寻找第2个最小元素
  36.    
  37.     int result = quickSelect(arr, 0, n - 1, k);
  38.    
  39.     cout << "第" << k << "个最小元素是:" << result << endl;
  40.    
  41.     return 0;
  42. }
复制代码


上述代码中,`quickSelect`函数用于执行快速选择算法,其中`partition`函数用于进行数组的分割操作。在`main`函数中,我们定义了一个整型数组`arr`,并使用`quickSelect`函数寻找第k个最小元素。

希望对你有所帮助!如果还有其他问题,请随时向我提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-1-15 17:12:42 | 显示全部楼层    本楼为最佳答案   
快速选择算法是一种用于在无序数组中寻找第k个最小元素的算法。它的思想类似于快速排序,通过将数组分成两部分,其中一部分比pivot元素小,另一部分比pivot元素大。然后根据pivot元素所在的位置,判断第k个最小元素在哪一部分,并对相应的部分进行递归处理。

以下是一个使用快速选择算法寻找第k个最小元素的示例代码:

  1. #include <iostream>
  2. using namespace std;

  3. int partition(int arr[], int low, int high) {
  4.     int pivot = arr[high];  // 选择最右边的元素作为pivot
  5.     int i = low - 1;
  6.    
  7.     for (int j = low; j < high; j++) {
  8.         if (arr[j] <= pivot) {
  9.             i++;
  10.             swap(arr[i], arr[j]);
  11.         }
  12.     }
  13.     swap(arr[i + 1], arr[high]);
  14.     return i + 1;
  15. }

  16. int quickSelect(int arr[], int low, int high, int k) {
  17.     if (low == high) {
  18.         return arr[low];
  19.     }
  20.    
  21.     int pivotIndex = partition(arr, low, high);
  22.     int rank = pivotIndex - low + 1;
  23.    
  24.     if (rank == k) {
  25.         return arr[pivotIndex];
  26.     } else if (rank < k) {
  27.         return quickSelect(arr, pivotIndex + 1, high, k - rank);
  28.     } else {
  29.         return quickSelect(arr, low, pivotIndex - 1, k);
  30.     }
  31. }

  32. int main() {
  33.     int arr[] = {3, 1, 5, 2, 4};
  34.     int n = sizeof(arr) / sizeof(arr[0]);
  35.     int k = 2;  // 寻找第2个最小元素
  36.    
  37.     int result = quickSelect(arr, 0, n - 1, k);
  38.    
  39.     cout << "第" << k << "个最小元素是:" << result << endl;
  40.    
  41.     return 0;
  42. }
复制代码


上述代码中,`quickSelect`函数用于执行快速选择算法,其中`partition`函数用于进行数组的分割操作。在`main`函数中,我们定义了一个整型数组`arr`,并使用`quickSelect`函数寻找第k个最小元素。

希望对你有所帮助!如果还有其他问题,请随时向我提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 16:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表