有序數列中位

2021-07-02 03:52:36 字數 874 閱讀 6087

核心是將原問題轉變成乙個尋找第k小數的問題(假設兩個原序列公升序排列),這樣中位數實際上是第(m+n)/2小的數。所以只要解決了第k小數的問題,原問題也得以解決。

首先假設陣列a和b的元素個數都大於k/2,我們比較a[k/2-1]和b[k/2-1]兩個元素,這兩個元素分別表示a的第k/2小的元素和b的第k/2小的元素。這兩個元素比較共有三種情況:>、《和=。如果a[k/2-1]證明也很簡單,可以採用反證法。假設

a[k/2-1]大於合併之後的第k小值,我們不妨假定其為第(k+1)小值。由於a[k/2-1]小於b[k/2-1],所以b[k/2-1]至少是第(k+2)小值。但實際上,在a中至多存在k/2-1個元素小於a[k/2-1],b中也至多存在k/2-1個元素小於a[k/2-1],所以小於a[k/2-1]的元素個數至多有k/2+ k/2-2,小於k,這與a[k/2-1]是第(k+1)的數矛盾。

當a[k/2-1]>b[k/2-1]時存在類似的結論。

當a[k/2-1]=b[k/2-1]時,我們已經找到了第k小的數,也即這個相等的元素,我們將其記為m。由於在a和b中分別有k/2-1個元素小於m,所以m即是第k小的數。(這裡可能有人會有疑問,如果k為奇數,則m不是中位數。這裡是進行了理想化考慮,在實際**中略有不同,是先求k/2,然後利用k-k/2獲得另乙個數。)

通過上面的分析,我們即可以採用遞迴的方式實現尋找第k小的數。此外我們還需要考慮幾個邊界條件:

最終實現的**為:

int min(int a, int b) 

double findkth(int a, int m, int b, int n, int k)

double findmediansortedarrays(int* a, int m, int* b, int n)

有序數列第K小

給出兩個長度分別為 n,m 的單調非遞減數列,求出它們合併後的第 k 小值。第一行三個數,n,m,k 如題意所述 第二行 n 個數,依次為數列1 第三行 m 個數,依次為數列2 乙個數,表示合併後的第 k 小值。對於所有資料,k le n mk n m a i le 10 8 時間限制200ms。這...

有序數列的資料插入問題

3 實驗3 2 有序數列的資料插入問題 程式設計分析,這個問題包括3個關鍵步驟 1 確定要插入資料的位置。這步操作使用的方法有很多種,如可以使用折半查詢比較的方法,也可以使用順序比較的方法 2 將自插入位置開始後的所有資料都向後移動乙個位置,以便空出要插入資料的位置。若插入資料位置在原有所有資料之後...

ZZULIOJ 1118 數列有序 陣列

time limit 1 sec memory limit 128 mb submit 5563 solved 2745 submit status web board 乙個非遞減有序的整型陣列有n個元素,給定乙個整數num,將num插入該序列的適當位置,使序列仍保持非遞減有序。輸入有三行。第一行是...