若陣列有奇數個元素,中位數是a[(n-1)/2];若陣列有偶數個元素,中位數為a[n/2-1]和a[n/2]兩個數的平均值。這裡為方便起見,假設陣列為奇數個元素。
思路一:把無序陣列排好序,取出中間的元素。時間複雜度取決於排序演算法,最快是快速排序,o(nlogn),或者是非比較的基數排序,時間為o(n),空間為o(n)。這明顯不是我們想要的。
思路二:採用快速排序的分治partition過程。任意挑乙個元素,以該元素為支點,將陣列分成兩部分,左邊是小於等於支點的,右邊是大於支點的。如果左側長度正好是(n-1)/2,那麼支點恰為中位數。如果左側長度<(n-1)/2, 那麼中位數在右側,反之,中位數在左側。 進入相應的一側繼續尋找中位數。
//快速排序的分治過程找無序陣列的中位數
int partition(int a, int low, int high) //
快排的一次排序過程
a[low] =q;
return
low;
}int findmidium(int a, int
n)
return
a[index];
}
思路三:將陣列的前(n+1)/2個元素建立乙個最小堆。然後,對於下乙個元素,和堆頂的元素比較,如果小於等於,丟棄之,如果大於,則用該元素取代堆頂,再調整堆,接著看下乙個元素。重複這個步驟,直到陣列為空。當陣列都遍歷完了,(堆中元素為最大的(n+1)/2個元素,)堆頂的元素即是中位數
1//構建最小堆找無序陣列的中位數
2void nswap(int& i, int&j)38
void minheapify(int a, int i, int
len)923
}24void buildminheap(int a, int
len)
2530}31
int findmidium2(int a, int
n)32
41}42return a[0
];43 }
試用O n 來實現求出乙個無序陣列的中位數
對於這個問題我起初就想到了多數派問題 那麼受這個問題的影響,我就先到了一種方法 就是建立乙個中間判斷元素。left right 兩個計數器來記錄,通過遍歷陣列的過程中,每次都是嘗試兩邊的元素數量盡量相同,在這個過程中,如果右邊多,那麼就讓下個元素分配在左邊,同理亦然 那麼用 實現就是簡單的 left...
求乙個無序陣列的中位數
求乙個無序陣列的中位數 中位數是將陣列排序之後,陣列個數為奇數時,取中間的即為中位數 陣列個數為偶數時,取中間兩個的平均值即為中位數。思路一 要取得中位數,即給陣列排序,使用任意排序演算法均可,然後按陣列下標取其中位數。ps 該方法很直觀,此處不實現 思路二 1.設陣列元素為n個,且為奇數個時,取陣...
求乙個無序陣列的中位數
思路一 利用堆排序的思路 將前n 2的元素放進乙個大堆裡,然後將後續的元素與堆頂比較,如果比堆頂大,則繼續比下乙個,如果比堆頂小,則與堆頂的值進行交換。這樣操作完後,堆裡的元素都是比堆頂小的,不再堆裡的元素都比堆頂大,則堆頂就是中位數。void findmid int a,int size 中位數是...