無序陣列的中位數

2021-08-04 23:48:30 字數 1324 閱讀 9004

題目:求出乙個無需陣列的中位數。

例:的中位數為5,的中位數為4和5。

要求: 不能使用排序。

思路1:將資料平均分配到最大堆和最小堆中,並且保證最小堆中的資料存放的資料都比最大堆中是資料大,那麼此時最小堆堆頂的元素一定是中位數。

那麼如何保證最小堆中的元素,都比大堆中的元素大

(1)遍歷陣列,將第i個數插入堆中,i為奇數時,插入最小堆,i為偶數時插入最大堆。(最大堆的插入的資料比較大)

(2)每次插入時,將最大堆和最小堆的堆頂交換。

struct greater

};void getmidnumnosort1(int arr, int size)

}if ((size & 1) == 0)//偶數

cout

<< "中位數:"

<< max_heap.top() << " "

<< min_heap.top() << endl;

else

cout

<< "中位數:"

<< max_heap.top() << endl;

}

思路2:

(1)將前(n+1)/2個元素調整為乙個小頂堆

(2)對後續的每乙個元素,和堆頂比較,如果小於等於堆頂,丟棄之,取下乙個元素。 如果大於堆頂,用該元素取代堆頂,調整堆,取下一元素。重複這個步驟

(3) 當遍歷完所有元素之後,堆頂即是中位數。

void getmidnumnosort2(int arr,int size)

}if ((size & 1) == 1)//奇數

else

}

思路3:任意挑乙個元素,以該元素為支點,劃分集合為兩部分,如果左側集合長度恰為 (n-1)/2,那麼支點恰為中位數。如果左側長度小於(n-1)/2, 那麼中位數在右側,反之,中位數在左側。 進入相應的一側繼續尋找中位數。

//挖坑法

int partsort(int arr, int left,int right)

//從右找比key小

while (left < right && arr[right] >= key)

--right;

if (left < right)

}arr[left] = key;

return left;

}void getmidnumnosort3(int arr,int size)

else

}cout << "中位數"

<< arr[div] << endl;

}

無序陣列的中位數

參考 中位數,就是陣列排序後處於陣列最中間的那個元素。說來有些麻煩,如果陣列長度是奇數,最中間就是位置為 n 1 2的那個元素。如果是偶數呢,標準的定義是位置為n 2和位置為n 2 1的兩個元素的和除以2的結果,有些複雜。為了解答的方便,我們假設陣列長度暫且都為奇數吧。面試時,大家是不是經常被問到,...

無序陣列的中位數

不能使用排序演算法,而且要求時間複雜度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 遍歷剩餘元素,如果剩餘元素小於堆頂元素,則丟棄或不作處理 如果剩餘元素大於堆頂元素,則將其取代堆頂元素...