參考
中位數,就是陣列排序後處於陣列最中間的那個元素。說來有些麻煩,如果陣列長度是奇數,最中間就是位置為(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 遍歷剩餘元素,如果剩餘元素小於堆頂元素,則丟棄或不作處理 如果剩餘元素大於堆頂元素,則將其取代堆頂元素...