算法-查找數組中的前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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章