演算法-查詢陣列中的前M大的數
阿新 • • 發佈:2019-02-12
查詢陣列中的前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;
}