對於這個問題我起初就想到了多數派問題;那麼受這個問題的影響,我就先到了一種方法:就是建立乙個中間判斷元素。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 中位數是...