【數據結構——數組(二)】查找數組中第k大的數

 

問題:  查找出一給定數組中第k大的數。例如[3,2,7,1,8,9,6,5,4],第1大的數是9,第2大的數是8……

思考:

1. 直接從大到小排序,排好序後,第k大的數就是arr[k-1]。 

2. 只需找到第k大的數,不必把所有的數排好序。我們藉助快速排序中partition過程,一般情況下,在把所有數都排好序前,就可以找到第k大的數。我們依據的邏輯是,經過一次partition後,數組被pivot分成左右兩部分:S左、S右。當S左的元素個數|S左|等於k-1時,pivot即是所找的數;當|S左|小於k-1,所找的數位於S右中;當|S左|>k-1,所找的數位於S左中。顯然,後兩種情況都會使搜索空間縮小。

算法的時間複雜度爲:O(N)--詳情參考算法導論。

#include<iostream>
using namespace std;
int Partition(int a[], int i, int j)
{
    int  temp = a[i];
    if (i < j)
    {
        while (i < j)
        {
            //從後往前掃找比樞軸值小的交換位置
            while (i<j&&a[j] >= temp)  j--;
            if (i < j)  a[i] = a[j];
            while (i < j&&a[i] < temp) i++;
            if (i < j)  a[j] = a[i];
        }
        a[i] = temp;
        return i;
    }
}
int Search(int a[], int i, int j, int k)
{
    int m = Partition(a, i, j);
    if (k==m-i+1)  return a[m];
    else if (k<m-i+1)
    {
        return Search(a, i, m-1,k );
    }
    //後半段
    else
    {
        return Search(a, m+1, j, k-(m-i+1));
    }
}
int main()
{
    int a[7] = { 1,2,3,4,6,7,8 };
    int k = 3;
    cout << Search(a,2, 6, k);
}

參考博文:https://www.cnblogs.com/wsw-seu/p/7652495.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章