題目:求出乙個無需陣列的中位數。
例:的中位數為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 遍歷剩餘元素,如果剩餘元素小於堆頂元素,則丟棄或不作處理 如果剩餘元素大於堆頂元素,則將其取代堆頂元素...