找出無序數組中第k小的數


題目描述:

給定一個無序整數數組,返回這個數組中第k小的數。

 

解析:

最平常的思路是將數組排序,最快的排序是快排,然后返回已排序數組的第k個數,算法時間復雜度為O(nlogn),空間復雜度為O(1)。使用快排的思想,但是每次只對patition之后的數組的一半遞歸,這樣可以將時間復雜度將為O(n)。

 

代碼實現:

#include <iostream>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>

using namespace std;

void swap(int *p, int *q)
{
    int t;
    t = *p;
    *p = *q;
    *q = t;
}

int findNumberK(vector<int> &vec, int k, int s, int e)
{
    int roll = vec[s], be = 0, j = s;
    for(int i = s+1 ; i<= e ; i++)
    {
        if(vec[i] < roll)
        {
            j++;
            swap(&vec[i], &vec[j]);
            be++;
        }
    }

    swap(&vec[s], &vec[j]);

    if(be == k -1 )
        return roll;
    else if (be < k - 1)
    {
        return findNumberK(vec, k - be - 1, j + 1, e);
    }
    else
        return findNumberK(vec, k, s, j - 1);
}

int main()
{
    vector<int> a;
    int temp, k;

    cout << "input data:" << endl;
    cin >> temp;

    while(temp != 0)
    {
        a.push_back(temp);
        cin >> temp;
    }

    cout << "input K: " << endl;

    cin >> k;

    int re = findNumberK(a , k, 0 ,a.size() - 1);

    cout << "Test Result: "  << re << endl;

    sort(a.begin(), a.end(), less<int>());

    cout << "real Result: "  << a[k-1] << endl;
    return 0;
}

 

執行效果:

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM