1. 程式人生 > >演算法-查詢陣列中的前M大的數

演算法-查詢陣列中的前M大的數

查詢陣列中的前M大的數

  • 思路
根據快速排序的Partition的思想,假定陣列長度為n, 選定一個pivot,總能將陣列分為 [0,k-1]和[k,n], 
其中[0,k-1]<pivot,[k+1,n] > pivot。如果 k = m, 那麼演算法結束。如果k > m, 對[k+1,n]繼續進行切分,
每次切分k都會減少一部分, 直到k = m, 如果k < m, 對[0,k-1]繼續切分出m-k個大的數, 每次切分k都會
增加一部分,直到k = m。 
  • 演算法複雜度

    平均演算法複雜度為:O(n) = n,最壞情況的複雜度為:O(n) = n。

cpp實現

int Partition(int arr[], int start, int end) {
    int pivot = arr[start];
    int highvac = end;
    int lowvac = start;
    int direct = true; //true for right,false for left. start from left 
    while(lowvac < highvac) {
        if(direct == true) {
            if(arr[highvac] <pivot) {
                arr[
lowvac] = arr[highvac]; lowvac++; direct = false; } else { highvac--; } } else { if(arr[lowvac] > pivot) { arr[highvac] = arr[lowvac]; highvac--; direct = true
; } else { lowvac++; } } } arr[highvac] = pivot; return highvac; } int* findXMaxValue(int arr[], int xmax, int start, int end) { int p = 0; static int* maxs = new int[xmax]; int cmax = end - start +1; int len = end; if (xmax >= len+1) { return arr; } while(cmax != xmax) { p = Partition(arr,start,end); cmax = len-p+1; if(cmax > xmax) { start = p+1; } else if ( cmax < xmax) { end = p-1; start = 0; } } for(int j = 0; j < xmax; j++) { maxs[j] = arr[p+j]; } return maxs; }