尋找中項,時間復(fù)雜度O(n) C/C++實現(xiàn)

題目

對于長度為n的整型數(shù)組A,隨機生成其數(shù)組元素值,然后實現(xiàn)一個線性時間的算法,在該數(shù)組中查找其中項。

算法思想

選擇數(shù)組中任意數(shù)作為基準(zhǔn),將數(shù)組分為大于,小于,等于此數(shù)的三部分,尋找中項。設(shè)小于基數(shù)的個數(shù)為n_small,大于的為n_big,數(shù)組長度的一般為k,若k<=n_s,說明中項在小于基數(shù)的數(shù)組里面,再對small數(shù)組遞歸上述操作,若k=n_s+1,則說明中項就是基數(shù),若k>n_s+1,說明中項在big數(shù)組里,那么對big數(shù)組遞歸,此時k=k-1-n_s。

代碼

#include <iostream>
#include <vector>
using namespace std;
int select(vector<int>&A, int k,int n)
{
    int x = A[rand() % n];
    vector<int>small;
    small.resize(n);
    vector<int>big;
    big.resize(n);
    int equal,n_s=0,n_b=0;
    for (int i = 0; i < n; i++)
    {
        if (A[i] > x)
            big[n_b++] = A[i];
        else if (A[i] == x)
            equal = x;
        else
            small[n_s++] = A[i];
    }
    if (k <= n_s)
        return select(small, k,n_s);
    else if (k == n_s + 1)
        return equal;
    else
        return select(big, k - 1 - n_s,n_b);
}
int main(void)
{
    vector<int>A;
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        int temp;
        cin >> temp;
        A.push_back(temp);
    }
    int k = (1 + n) / 2;
    cout << select(A, k,n);
    system("pause");
    return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在C語言中,五種基本數(shù)據(jù)類型存儲空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 4,045評論 0 2
  • 1. 找出數(shù)組中重復(fù)的數(shù)字 題目:在一個長度為n的數(shù)組里的所有數(shù)字都在0到n-1的范圍內(nèi)。數(shù)組中某些數(shù)字是重復(fù)的,...
    BookThief閱讀 2,016評論 0 2
  • 在公眾號讀到喜歡的詩 是加微信前的與詩人之交 這個朋友圈能讀新詩不聊平常天 === === === === ===...
    微風(fēng)LG閱讀 262評論 0 3
  • 《留王郎》 年代:宋作者:黃庭堅 河外吹沙塵,江南水無津。 骨肉常萬里,寄聲何由頻。 我隨簡書來,顧影將一身。 留...
    37dc9392ece7閱讀 501評論 0 0
  • 雨滴越來越急,越點越大。還好,我拿著雨披。 孩子下課了,恰好我碰到的一個熟人把女兒隨車帶走了。我穿好雨披騎上電車,...
    問芯閱讀 583評論 0 2

友情鏈接更多精彩內(nèi)容