試用O n 來實現求出乙個無序陣列的中位數

2021-07-23 16:45:49 字數 1623 閱讀 8020

對於這個問題我起初就想到了多數派問題;那麼受這個問題的影響,我就先到了一種方法:就是建立乙個中間判斷元素。left , right 兩個計數器來記錄,通過遍歷陣列的過程中,每次都是嘗試兩邊的元素數量盡量相同,在這個過程中,如果右邊多,那麼就讓下個元素分配在左邊,同理亦然、

那麼用**實現就是簡單的;left(程式用cx) , right(程式用cy); z  為中間計數的判斷;一直到迴圈結束才能求出來。

#includeusing namespace std;

int& zws(int arr,int len);

int main();

cout << "the median of the array is : " << zws(arr,7)cy++;

}else

cx++;

} i++;

cout << "cx= "<——————————————————————————

然而,然而這個想法是錯的,沒錯,是錯的,聰明的讀者,你們可以想想怎麼來聯立這個關係準確去實現;——————————————————————————

——————————————

附錄:補敘下多數派問題:

多數派問題

問題簡述:

假設陣列v[1...n]中的每個元素v[i](1<=i<=n)對應於m個元素中的乙個,這裡m個元素用整數1~m表示,現在需要判斷在陣列v中是否有某個元素出現的次數,超過了半數。如果,v[1...n]對應於n張選票,1~m對應於m個候選人,這個問題實際上就是要判斷是否有候選人的得票數嚴格過半(大於n/2)。

解決思路:

robert s.boyer和j strother moore兩位牛人(就是bm演算法的提出者),在《mjrty-a fast majority vote algorithm》一文中,提出了乙個巧妙演算法,使得我們即使不知道m的具體情況,也可以在o(n)時間複雜度,o(1)空間複雜度內,判斷是否有候選人的得票數過半。該演算法在執行過程中,需要兩個臨時變數c和t,c記錄當前可能得票數過半的候選人編號,t記錄該候選人的淨超出次數。對於c而言,除了可以等於1~m中的任何值之外,還有另一種狀態,我們把其叫做未知狀態,用於表示當前任何候選人的得票數都不可能過半(程式中可以用0,或者-1表示),t的最小值為0,程式開始執行時c為未知狀態(c=0),t=0,然後按照如下方法處理投票陣列v。

實現程式

int majority(const int array, size_t array_size)

if(candidate == array[i])

if(--times == 0)

} if(candidate == -1)

for(i = 0, times = 0; i < array_size; ++i)

} if(times > array_size / 2)

return -1;

}

從乙個無序陣列中求出第K大 小的數

這個題目可以作為練習寫大 小根堆的實現,不過貌似時間複雜度還是蠻高的。在洛谷上面一道模板題上面好像就超時了幾個點,不知道是不是我實現的問題。那麼除此之外,最容易想到的方法是先對該陣列進行排序,然後取出第k或max k數來。當選擇使用快排的時候,時間複雜度是 o nlogn 但還有一種更優的方法是利用...

求乙個無序陣列的中位數

求乙個無序陣列的中位數 中位數是將陣列排序之後,陣列個數為奇數時,取中間的即為中位數 陣列個數為偶數時,取中間兩個的平均值即為中位數。思路一 要取得中位數,即給陣列排序,使用任意排序演算法均可,然後按陣列下標取其中位數。ps 該方法很直觀,此處不實現 思路二 1.設陣列元素為n個,且為奇數個時,取陣...

求乙個無序陣列的中位數

思路一 利用堆排序的思路 將前n 2的元素放進乙個大堆裡,然後將後續的元素與堆頂比較,如果比堆頂大,則繼續比下乙個,如果比堆頂小,則與堆頂的值進行交換。這樣操作完後,堆裡的元素都是比堆頂小的,不再堆裡的元素都比堆頂大,則堆頂就是中位數。void findmid int a,int size 中位數是...