当前位置:   article > 正文

算法竞赛宝典 分治算法 第k个数(不一样的二分)_第k大数分治算法

第k大数分治算法
题目: 

N个无序的数(可能数目非常大),选出其中最大的K个数。


方法一:对所有元素进行排序,之后取出前K个元素,不提倡使用

思路:使用最快排序算法,选择快排 或 堆排

时间复杂度:O(n*logn) + O(K) = O(n*logn)

特点:需要对全部元素进行排序,K = 1 时,时间复杂度也为O(n*logn)


方法二:只需要对前K个元素排序,不需要对N-K个元素进行排序,不提倡使用

思路:使用 选择排序 或 起泡排序,进行K次选择,可得到第k大的数

时间复杂度:O(n*k)

//这个二分跟以前的二分不一样在于mid,这个的意思是以第一个为标准进行划分,最后确定于k的关系
  1. #include<iostream>
  2. #include<bits/stdc++.h>
  3. const int N=100000+10;
  4. using namespace std;
  5. int a[N];
  6. int b[N];
  7. void binary_search(int left,int right)
  8. {
  9. int i=left;
  10. int j=right;
  11. while(i!=j)
  12. {
  13. if(i<j)
  14. {
  15. if(a[i]>a[j])
  16. {
  17. swap(a[i],a[j]);
  18. swap(i,j);
  19. }
  20. else
  21. j--;
  22. }
  23. else
  24. {
  25. if(a[i]<a[j])
  26. {
  27. swap(a[i],a[j]);
  28. swap(i,j);
  29. }
  30. else
  31. j++;
  32. }
  33. }
  34. if(i>k)
  35. {
  36. binary_search(left,i-1);
  37. }
  38. else if(i<k)
  39. {
  40. binary_search(i+1,right);
  41. }
  42. else
  43. {
  44. for(int p=1; p<=n; p++)
  45. {
  46. if(b[p]==a[k])
  47. {
  48. printf("%d\n",p);
  49. break;
  50. }
  51. }
  52. }
  53. }
  54. int main()
  55. {
  56. int n,k;
  57. while(cin>>n>>k)
  58. {
  59. for(int i=1; i<=n; i++)
  60. {
  61. scanf("%d",&a[i]);
  62. b[i]=a[i];
  63. }
  64. binary_search(1,n);
  65. }
  66. return 0;
  67. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/574972
推荐阅读
相关标签
  

闽ICP备14008679号