給一列無序陣列,求出中位數並給出演算法的時間複雜度

2022-03-26 08:33:10 字數 1022 閱讀 9333

若陣列有奇數個元素,中位數是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 中位數是...