1.最簡單的方法:將n個數排序,排序後的前k個數就是最大的k個數,這種演算法的複雜度是o(nlogn)
2.o(n)的方法:利用快排的patition思想,基於陣列的第k個數來調整,將比第k個數小的都位於陣列的左邊,比第k個數大的都調整到陣列的右邊,這樣調整後,位於陣列右邊的k個數最大的k個數(這k個數不一定是排好序的)
3.o(nlogk)的方法:先建立乙個大小為k的最小堆,接下來我們每次從輸入的n個整數中讀入乙個數,如果這個數比最小堆的堆頂元素還要大,那麼替換這個最小堆的堆頂並調整。
package io.fredia;
/** * 堆排序
* */public
class
heapsorttest
public
int[
]getrandomindexarray
(int
random,
int mapsize,
int numberofindex)
else
if(i == numberofindex)
else
}return indexes;
}public
int[
]getinitialarray
(int numofindex)
return indexes;
}public
int[
]insertnumintoheap
(int
numbers,
int numtoinsert)
return numbers;
}private
void
compareandexchange
(int
numbers,
int index)
else
if(rightchildindex == numbers.length)
}else
if(numbers[rightchildindex]
< numbers[changeindex])if
(changeindex != index)}}
public
static
void
swap
(int
data,
int i,
int j)
data[i]
= data[i]
+ data[j]
; data[j]
= data[i]
- data[j]
; data[i]
= data[i]
- data[j];}
public
static
void
heapsort
(int
data)
}public
static
void
createmaxdheap
(int
data,
int lastindex)}if
(data[k]
< data[biggerindex]
)else}}
}public
static
void
print
(int
data)
system.out.
println()
;}}
int
partition
(int
* arr,
int low,
int high)
arr[low]
= pivot;
return low;
}void
non_recursive_qsort
(int
* arr,
int low,
int high)
if(high > pivot +1)
//其實就是用棧儲存每乙個待排序子串的首尾元素下標,下一次while迴圈時取出這個範圍,對這段子序列進行partition操作
//如果pivot的左段或右段已經少於兩個元素了,則無需再對這個子段partition了
while
(!s.
empty()
)if(high > pivot +1)
}}
找最大的N個數
題目 找最大的n個數 時間限制1000 ms,記憶體限制256000 kb,長度限制8000 b。給定n個整數,找最大的前m個數 不一定有序 要求時間複雜度盡量低。先輸入n和m 1 m n 50000 然後下面n行每行代表乙個整數 每個整數在int範圍內 輸出有m行,每行乙個整數,表示最大的m個數。...
列印N個陣列整體最大的Top K
問題描述 n個陣列用二維陣列表示 vector data 將所有數按照從大到小的順序進行排序,輸出前k個數,但這樣在面對海量資料時時間複雜度較高,利用堆的思想進行求解,步驟 1 建堆,將每個陣列的最後乙個數加入堆中,建立乙個大小為n的大堆 2 此時堆頂元素為所有資料中的最大的資料,輸出 3 假設堆頂...
列印N個陣列整體最大的TopK
題目 有n個長度不一的陣列,所有的陣列都是有序的,請從大到小列印這個n個陣列整體最大的前k個數。例如,輸入含有n行元素的二維陣列可以代表n個一維陣列。219,405,538,845,971 148,558 52,99,348,691 再輸入整數k 5,則列印 971,845,691,558,538 ...