给定一个数组,统计前k大的数并且把这k个数从大到小输出。
第一行包含一个整数n,表示数组的大小。n < 100000。 第二行包含n个整数,表示数组的元素,整数之间以一个空格分开。每个整数的绝对值不超过100000000。 第三行包含一个整数k。k < n。
从大到小输出前k大的数,每个数一行。
10 4 5 6 9 8 7 1 2 3 0 5
9 8 7 6 5
排序(应用快速排序)后输出,复杂度(nlogn)
(设数组起始下标为start,结束下边为end,基准元素下标为PRivot) 1.应用快速排序的思想,一趟快速排序后,privot左边的所有元素都<=privot,privot右边的所有元素都>=privot, 2.此时若privot右边的元素个数(end-privot+1)刚好等于K就rerturn 如果右边的元素个数少于K,那么在[start,privot-1]的范围内再找前(k-(end-privot+1))大的数 否则就继续在[privot+1,end]的范围内找前k大的数
每次都是选择数组的前部分或者后一部分进行操作,我们在这里假设每次都恰好是一半 T(n) = T(n/2) + a*n = T(n/4) + a*n/2 + a*n = T(n/8) + a*n/4 + a*n/2 + a*n = … … = T(1) + … …+ a*n/8 + a*n/4 + a*n/2 + a*n < 2*a*n 即 O(n)
注:部分思想引用于郭炜老师的《程序设计与算法二》
新闻热点
疑难解答