無序陣列的中位數

2021-10-24 09:37:21 字數 1499 閱讀 1257

參考

中位數,就是陣列排序後處於陣列最中間的那個元素。說來有些麻煩,如果陣列長度是奇數,最中間就是位置為(n+1)/2的那個元素。如果是偶數呢,標準的定義是位置為n/2和位置為n/2+1的兩個元素的和除以2的結果,有些複雜。為了解答的方便,我們假設陣列長度暫且都為奇數吧。

面試時,大家是不是經常被問到,怎麼求乙個無序陣列(長度為n)的中位數?

不假思索的演算法是,首先將陣列排序,然後直接從排序陣列中找出中位數。這個演算法的複雜度是o(nlogn),就是排序的複雜度。當然,答案是有了,但不會impress面試官的:)。but it is ok, 如果你能寫出**。

public

void

sort

(int arr,

int low,

int high)

while

(l<=povit) l++;if

(l(l>low)

sort

(arr,low,l-1)

;if(lsort

(arr,l+

1,high)

;}

另外乙個優化的快速演算法是快速中位數演算法,類似於快速排序,採用的是分而治之的思想。基本思路是:任意挑乙個元素,以該元素為支點,將陣列分成兩部分,左部分是小於等於支點的,右部分是大於支點的。如果你的運氣爆棚,左部分正好是(n-1)/2個元素,那麼支點的那個數就是中位數。否則的話,相信你知道怎麼推理了。寫出沒有bug的**還是需要一點點功力的。作為家庭作業好了。

public

static

double

median2

(int

array)

return array[index];}

public

static

intpartition

(int

array,

int left,

int right)

swap

(array, left, pos)

;return left;

}

這裡,給大家介紹乙個讓人眼前一亮的演算法,至少,看著很美妙,可以細細品味。演算法的核心是使用最小堆(heap),你想到了嗎?

首先將陣列的前(n+1)/2個元素建立乙個最小堆。

然後,對於下乙個元素,和堆頂的元素比較,如果小於等於,丟棄之,接著看下乙個元素。如果大於,則用該元素取代堆頂,再調整堆,接著看下乙個元素。重複這個步驟,直到陣列為空。

當陣列都遍歷完了,那麼,堆頂的元素即是中位數。

可以看出,長度為(n+1)/2的最小堆是解決方案的精華之處。

public

static

double

median

(int

array)

for(

int i=heapsize; iif(array.length %2==

1)else

}

無序陣列的中位數

題目 求出乙個無需陣列的中位數。例 的中位數為5,的中位數為4和5。要求 不能使用排序。思路1 將資料平均分配到最大堆和最小堆中,並且保證最小堆中的資料存放的資料都比最大堆中是資料大,那麼此時最小堆堆頂的元素一定是中位數。那麼如何保證最小堆中的元素,都比大堆中的元素大 1 遍歷陣列,將第i個數插入堆...

無序陣列的中位數

不能使用排序演算法,而且要求時間複雜度o n coding utf 8 time 2019 4 22 10 42 am author george file main7.py contact georgewang1994 163.com defheapify seq,start,end 找出從sta...

無序陣列求中位數

長度為 n 的無序陣列,求中位數,如何盡快的估算出中位數,演算法複雜度是多少?如果陣列中元素有奇數個,可以採用這種演算法 步驟 1 可以將陣列的前 n 1 2 個元素,建立 1 個最小堆 步驟 2 遍歷剩餘元素,如果剩餘元素小於堆頂元素,則丟棄或不作處理 如果剩餘元素大於堆頂元素,則將其取代堆頂元素...