zoukankan      html  css  js  c++  java
  • 无序整数数组中找第k大的数

    方法一:基于快排

     1 /*
     2 基于区间快排的第K小算法 ,输出a[k-1]即可,O(n*logn);每次只对后半部分递归便可把复杂度降到O(n) 
     3 主要思路是每次随机在数组中选取一个元素p,利用这个元素将数组分成两部分,比p小的元素在分好的数组左边,p和比p大的元素在数组右边,
     4 根据k值选择在数组左半或者右半部分继续递归执行查找。
     5 */
     6 #include <iostream>
     7 #include <cstring>
     8 #include <vector>
     9 #include <algorithm>
    10 using namespace std;
    11 
    12 void swap(int *p, int *q)
    13 {
    14     int t;
    15     t = *p;
    16     *p = *q;
    17     *q = t;
    18 }
    19 
    20 int findNumberK(vector<int> &vec, int k, int from, int to)
    21 {
    22     int roll = vec[from], middle = 0, j = from;//roll是指标杆值 
    23     for(int i = from+1 ; i<= to ; i++)
    24     {
    25         if(vec[i] < roll)
    26         {
    27             j++;//roll左边每次被换的元素 的下标 
    28             swap(&vec[i], &vec[j]);
    29             middle++;
    30         }
    31     }
    32     swap(&vec[from], &vec[j]);
    33     if(middle == k -1 )
    34         return roll;
    35     else if (middle < k - 1)
    36     {
    37         return findNumberK(vec, k - middle - 1, j + 1, to);
    38     }
    39     else
    40         return findNumberK(vec, k, from, j - 1);
    41 }
    42 
    43 int main()
    44 {
    45     vector<int> vec;
    46     int temp, k;
    47 
    48     cout << "input data(以0结束):" << endl;
    49     cin >> temp;
    50 
    51     while(temp != 0)
    52     {
    53         vec.push_back(temp);
    54         cin >> temp;
    55     }
    56 
    57     cout << "input K: " << endl;
    58 
    59     cin >> k;
    60 
    61     int re = findNumberK(vec , k, 0 ,vec.size() - 1);
    62 
    63     cout << "Test Result: "  << re << endl;
    64 
    65     sort(vec.begin(), vec.end(), less<int>());
    66 
    67     cout << "real Result: "  << vec[k-1] << endl;
    68     //while(1);
    69     return 0;
    70 }
  • 相关阅读:
    leetcode 29-> Divide Two Integers without using multiplication, division and mod operator
    ros topic 发布一次可能会接收不到数据
    python中的print()、str()和repr()的区别
    python 部分函数
    uiautomatorviewer错误 unable toconnect to adb
    pyqt 不规则形状窗口显示
    appium 计算器demo
    Spring 3.0 注解注入详解
    Spring Autowire自动装配
    restful 学习地址
  • 原文地址:https://www.cnblogs.com/hxsyl/p/2956964.html
Copyright © 2011-2022 走看看