堆的應用(堆排序,TopK問題)

堆的應用

1)排序 堆排序

選擇排序
既可以找到最大的放在最後
也可以找到最小的方最前

但是,堆排序不能找最小的放在最前
因爲把最小數放在最前,會破壞掉堆的原來的順序,除非重新建堆

1, 2,9,16,7,15,18,45,37,63,13

63,45,18,16,37,9,2,7,15,13,1

1,45,18,16,37,9,2,7,15,13, 63 再向下調整即可

堆排序:

排升序,建大堆
				排降序,建小堆
				原因:重新調整回根的成本更小,向下調整(O(logn))<建隊O(n)

僞代碼

int   array[]   int size;堆排序,排升序
	建大堆
	i=0;i的意義是被選出的最大的數的個數
	for(i<size-1){		
			//一次循環,找出一個最大的數放在最後
			Swap(&array[0],&array[size-1-i])
			//向下調整
			AdjustDown(array,size-1-i,0);
	}

在這裏插入圖片描述

建堆函數
在這裏插入圖片描述
向下調整函數
在這裏插入圖片描述

TopK問題

再海量數據中(n>>100*1000),找最大的k=10個數
建小堆
在這裏插入圖片描述