http://blog.csdn.net/realxie/article/details/8078043ios
假設有長度分爲爲M和N的兩個升序數組A和B,在A和B兩個數組中查找第K大的數,即將A和B按升序合併後的第K個數。算法
解法一:數組
使用兩個指針指向A和B的開頭,很容易在O(M+N)的時間內完成,此算法略過。spa
解法二:.net
使用二分的方法。算法思想在代碼註釋中指針
- #include <iostream>
- #include <string.h>
- #include <stdlib.h>
- using namespace std;
-
-
-
-
- int FindKthElm(int A[], int aBeg, int aEnd, int B[], int bBeg, int bEnd, int k)
- {
- if (aBeg > aEnd)
- {
- return B[bBeg + k - 1];
- }
- if (bBeg > bEnd)
- {
- return A[aBeg + k - 1];
- }
-
-
- int aMid = aBeg + (aEnd - aBeg)/2;
- int bMid = bBeg + (bEnd - bBeg)/2;
-
-
- int halfLen = aMid - aBeg + bMid - bBeg + 2;
-
- if (A[aMid] < B[bMid])
- {
- if (halfLen > k)
- {
-
-
-
- return FindKthElm(A, aBeg, aEnd, B, bBeg, bMid - 1, k);
- }
- else
- {
-
-
-
-
- return FindKthElm(A, aMid + 1, aEnd, B, bBeg, bEnd, k - (aMid - aBeg + 1));
- }
- }
- else
- {
-
- if (halfLen > k)
- {
- return FindKthElm(A, aBeg, aMid - 1, B, bBeg, bEnd, k);
- }
- else
- {
- return FindKthElm(A, aBeg, aEnd, B, bMid + 1, bEnd, k - (bMid - bBeg + 1));
- }
- }
- }
-
-
- int main()
- {
- const int ALen = 11;
- const int BLen = 5;
-
- int apos = 0;
- int bpos = 0;
- int A[ALen];
- int B[ALen];
-
-
- for (int i = 1; i <= ALen + BLen; ++i)
- {
- if (apos >= ALen)
- {
- B[bpos++] = i;
- }
- else if (bpos >= BLen)
- {
- A[apos++] = i;
- }
- else
- {
- if (rand()%2 == 1)
- {
- A[apos++] = i;
- }
- else
- {
- B[bpos++] = i;
- }
- }
- }
-
-
- for (int i = 0; i < ALen; ++i)
- {
- cout <<A[i] <<" ";
- }
- cout <<endl;
- for (int i = 0; i < BLen; ++i)
- {
- cout <<B[i] <<" ";
- }
- cout <<endl;
-
-
- for (int i = 1; i <= ALen + BLen; ++i)
- {
- cout << i <<" : "<<FindKthElm(A, 0 , ALen - 1, B, 0 , BLen - 1, i)<<endl;
- }
-
- return 0;
- }