o(n+mlogm)
n為快排中線性掃瞄時間,mlogm為對m各最大數進行歸併排序耗時
#includeusing namespace std;
int a[100];
void swap(int &a, int &b)
void merge(int a,int s,int m, int e, int tmp)//歸併 把每一小部分歸為有序
else
} while(p1 <= m)//把剩餘可能部分的加入歸併結果
tmp[pt++] = a[p1++];
while(p2 <= e)
tmp[pt++] = a[p2++];
for(int i = 0; i < e-s+1; ++i)
}void mergesort(int a,int s, int e,int tmp) }
void arrangeright(int *a, int s, int e, int k)//利用線性時間找出前k大的數放在右邊
//如果右邊的數剛好為e-i+1為k個
if(k == e - i + 1)
return;
//右邊的數大於k個
else if(k < e - i + 1)
//右邊的數小於k個,需要左邊取出k - (e-i+1)個
else
}int main()
; int tmp[11];
int n = sizeof(a)/sizeof(int);
int m;
scanf("%d",&m);
arrangeright(a,0,n-1,m);
mergesort(a,n-m,n-1,tmp);
for(int i = 0; i < n; ++i)
return 0;
}
輸出前m大的數
描述 給定乙個陣列包含n個元素,統計前m大的數並且把這m個數從大到小 輸出。輸入 第一行包含乙個整數n,表示陣列的大小。n 100000。第二行包含n個整數,表示陣列的元素,整數之間以乙個空格分開 每個整數的絕對值不超過100000000。第三行包含乙個整數m。m n。輸出從大到小輸出前m大的數,每...
Python 輸出前m大的數
給定乙個陣列包含n個元素,統計前m個大的數,並把這m大的數從大到小排列給出 第一行為乙個整數,表述要輸出的前m個數 第二行為n個整數,給出需要排序的陣列 從大到小的m大的數 先找m個大的放在陣列右邊然後再進行排序。找m個大的排在右邊的思想是對整個陣列進行一次快速排序,看返回的中間位置到陣列最後的大小...
輸出前m大的數(快排)
描述 給定乙個陣列,統計前m大的數並且把這k個數從大到小輸出。輸入第一行包含乙個整數n,表示陣列的大小。n 100000。第二行包含n個整數,表示陣列的元素,整數之間以乙個空格分開。每個整數的絕對值不超過100000000。第三行包含乙個整數m。m n。輸出從大到小輸出前m大的數,每個數一行。樣例輸...