演算法 通過堆排序,獲取前N個最大數

2022-08-01 21:39:13 字數 1684 閱讀 3145

在一組無序陣列中,比如{1,9,8,2,7,3,6,4,5}

將陣列看做是乙個,也可以用二叉樹來表示

但是這個堆現在還不是大頂堆,大頂堆的特點是父節點永遠大於左右子節點

第一步需要將這個堆構建成大頂堆

構建前需要知道的幾點:

/**

* 構建大頂堆**

@param

array 原始陣列

* @param

length 需要構建的長度

*/private

static

void buildmaxheap(int array, int

length) }​

/*** 調整大頂堆**

@param

array 被調整陣列

* @param

i 非葉子節點

* @param

length 需要調整的長度

*/private

static

void adjustheap(int array, int i, int

length)

//如果子節點》父節點

if (array[j] >temp)

else

//讓大的子節點等於之前非葉子節點的值

array[j] =temp;}}

當無序陣列第一次執行完buildmaxheap方法後,已經可以確定根節點就是最大值,然後將根節點的值與元素末尾的值交換

然後迴圈這個過程

/**

* 獲取前n個最大的數**

@param

array 原始陣列

* @param

n 前n個

*/public

static

int heapsort(int array, int

n)

int result = new

int[size];

system.arraycopy(array, array.length - size, result, 0, size);

return

result;

}

重點看這個地方

while (n > 0 && n <=length)
交換根節點和陣列末尾元素後,意思就是已經確定最大值,然後將n減1,length減1,n用來控制構建大頂堆的次數,構建n次,就能確定前n個最大值

然後再次構建大頂堆,直到n=0跳出迴圈

while迴圈結束,那麼陣列的後n項,已經是排序好了的

假如n=3那麼結果就是{7,8,9}

假如n=9那麼結果就是{1,2,3,4,5,6,7,8,9},也就是最終堆排序的結果

堆排序查詢前N個最大數和二分查詢演算法

先了解堆排序概念 堆排序利用了大根堆 或小根堆 堆頂記錄的關鍵字最大 或最小 這一特徵,使得在當前無序區中選取最大 或最小 關鍵字的記錄變得簡單。1 用大根堆排序的基本思想 先將初始檔案r 1.n 建成乙個大根堆,此堆為初始的無序區 再將關鍵字最大的記錄r 1 即堆頂 和無序區的最後乙個記錄r n ...

找前n個最大數 生成100個不重複的隨機數

假設有10000個數,需要找到裡面前10個最大數。樸素的解法當然是先排序,然後輸出前10 個數,時間複雜度最低為o logn 思考我們可以維護乙個10個元素大小的容器,用在某種演算法使得這個容器裡面維護的就是我們需要的10個數。先從vector開始思考,用前10和數初始化,然後不斷的遍歷剩餘元素,找...

快速排序以及基於快排思想的找前k個最大數

1 int partition vector v,int head,int rear 7swap v head v rear 8while v head key head 11swap v rear v head 1213 14 v head key 15 my count 16return hea...