題目:現在有兩個排好序的整數陣列,a[n]和b[n],要求寫乙個函式,功能為返回兩個陣列中第n大數和第n+1大數的中間值,即求解兩者的和除以2。
函式原型:double getmedian( int a, int b );
下面,我們先來分析乙個類似的問題,假設a和b都是公升序的,分別有n1和n2個元素,求兩個陣列合併後第k大元素值。
分別取兩個陣列中間索引的數,a[x]和b[y],比較兩個數的大小:
if( a[x] <= a[y] )
如果k <= x+y+1,則可以判斷出b[y]以及b[y]後面的元素都可以排除在外,減小搜尋規模。
如果k > x+y+1,則可以判斷出a陣列的前半部分元素都不符合條件,減少a一半的搜尋規模。
該演算法利用了遞迴的思想,結束條件是:
a中元素排除出去,則選擇b中得第k大元素;
b中元素全部排除,選擇a中第k大元素。
實現的**如下:
#include#include
#define n 5
int a[n] = ;
int b[n] = ;
//獲取陣列a中從s1到n1個元素
//陣列b中s2到n2個元素,合併後的第k大元素
int getmedian( int s1, int n1, int s2, int n2, int k )
else
}else
else
}return0;}
int main()
雅虎筆試題 兩個已經排好序的陣列,找中位數
題目 現在有兩個排好序的整數陣列,a n 和b n 要求寫乙個函式,功能為返回兩個陣列中第n大數和第n 1大數的中間值,即求解兩者的和除以2。函式原型 double getmedian int a,int b 下面,我們先來分析乙個類似的問題,假設a和b都是公升序的,分別有n1和n2個元素,求兩個陣...
找出兩個已經排好序的陣列的中位數
問題 給兩個已經排好序的陣列,乙個長度為 m m 1 乙個長度為 n n 1 找出這兩個陣列的中位數。時間複雜度要求為 o m n 空間複雜度為 o 1 其實這個問題本身來講是不難的,關鍵的關鍵,是對一些邊界條件的處理。思路 我們首先判斷中位數的位置,如果 m n 為奇數,那麼中位數的位置是 第 m...
排序 四 歸併排序(合併兩個已經排好序的陣列)
是建立在歸併操作上的一種有效的排序演算法。平均 最好和最壞時間複雜度都為o nlog2n 線性對數。是穩定的。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用,且各層分治遞迴可以同時進行。也叫歸併演算法,指的是將兩個已經排序的序列合併成乙個序列的操作。歸併排序演算法依...