由於快速排序每一輪都可以將乙個元素正確的歸位,所以我們可以利用快速排序的思想來定位中位數。
1)我們就以陣列的arr[0]為基準參照,如果第一輪快排過後,arr[0]的位置恰好被歸位到arr.length/2,則arr[0]肯定就是中位數;
2)如果arr[0]歸位後,位置小於arr.length/2(假如是i),則中位數肯定在arr[i+1]到arr[arr.length-1]之間。
3)如果arr[0]歸位後,位置大於arr.length/2(假如是j),則中位數肯定在arr[0]到arr[j-1]之間。
4)遞迴即可。
1using
system;
2using
system.diagnostics;
3using
system.linq;
4using
system.threading;56
namespace
middlenumber7;
11static stopwatch _stopwatch = new
stopwatch();
12static
void main(string
args)13"
,_stopwatch.elapsedmilliseconds);
21_stopwatch.reset();
_stopwatch.start();
22 console.writeline(getmiddlenum(_arr, 0, _arr.length / 2
));23
_stopwatch.stop();
24 console.writeline("
快排求中位數,毫秒數
",_stopwatch.elapsedmilliseconds);
25console.readkey();26}
27//
利用快速排序的思想尋找中位數,快排的每一輪可以完全確定乙個元素的歸位。
28private
static
int getmiddlenum(int arr, int idx, int
middle)
2951}52
}53//注意這裡有個陷阱:
54//
var t = new int ;
//只有乙個元素10
55//
exchange(ref t[0],ref t[0]);
56//
這樣的話,結果t[0]=0;而不再是10,達不到交換的目的;自己想想為什麼
57static
private
void exchange(ref
int a, ref
intb)
5863
//產生隨機數
64private
static
int getnumbers(int
x)65
72return
arr;73}
74}75 }
但是測出來時間差別不大,不知道為何。100000個隨機數,時間也一樣。
原來c#內建的sort演算法比較智慧型簡單說,c#內建sort演算法已經是最快的了。
結論:如果對陣列使用插入排序,氣泡排序,選擇排序,然後再取中間位置的數作為中位數,那就很慢。
與基於快排的中位數演算法差距就大了。
求中位數總結
今天在某個群中看到有人問在流式的資料中如何動態的維護中位數的方法,因為之前看到同學的乙個問題,當時他沒答出來。但是後來了解到類似top k last k 需要用到最大堆,最小堆一樣,中位數需要利用雙堆維護一下。先複習一下,如果是靜態的資料求取中位數的方法有哪些呢?1 排序 2 fink k 這兩種方...
Problem B 求中位數
實驗8 problem b 求中位數 description 中位數 medians 是乙個統計學名詞,是指將統計總體當中的各個資料的值按大小順序排列起來,形成乙個數列,處於變數數列中間位置的值就稱為中位數。當資料的項數n為奇數時,處於中間位置的資料值即為中位數 當n為偶數時,中位數則為處於中間位置...
問題 D 士兵排陣(中位數 貪心思想)
problem link 時間限制 1 sec 記憶體限制 128 mb 提交 48 解決 13 提交 狀態 討論版 在乙個劃分成網格的操場上,n個士兵散亂地站在網格點上。網格點由整數座標 x,y 表示。士兵們可以沿網格邊上 下 左 右移動一步,但在同一時刻任一網格點上只能有一名士兵。按照軍官的命令...