n個數里找最大的m個Topk 堆排序快排,非遞迴

2021-10-03 13:37:47 字數 2217 閱讀 5656

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 ...