堆排序及其乙個應用

2021-06-20 05:04:35 字數 880 閱讀 1469

今天為什麼會想寫一些關於堆排序的東西?因為在github中看到了乙個july的repository的演算法之道系列文章(中乙個找出n個數中最大(小)的前k個數?

我就開始想了,文中列舉了很多中解決辦法,我也想了幾種,大致差不多,但堆排序那裡我有點想法,或者說想寫詳細一點。

首先,我感覺july文章中最大堆和最小堆的概念和我理解的不一樣,我是認為最大堆的結構是parent節點大於左右chirldren節點,而july的相反,不過我覺得這個不是什麼大問題,叫法而已。言歸正傳。先寫堆排序:

堆排序的思想是通過維持乙個最大堆的結構來進行排序,為什麼要用堆的結構,因為堆的插入時間是o(h)

,h是最大堆的高度,這樣就有乙個維持最大堆的性質的函式

void max_heapify(int *a,int i,int length)else

else

//如果右孩子節點大於a[i],那麼賦值給largest

if(a[largest]

largest=right;

}//判斷左右子節點是否大於a[i]

if(i!=largest)

}然後下面的函式通過從a[length/2]處到a[1]的迴圈,是怎個樹的每個節點保持最大堆的性質,自然a[1]是最大的數

void  build_max_heap(int *a,int length)}最後

void heapsort(int *a,int length)

}到此堆排序就完成了,主函式中呼叫heapsort就行了

堆排序的乙個應用(july的文章中寫的很詳細,我就不贅述了)就是如上面引言中提到的july的文章中的「在1億個數中,找出前100或1000個最大的數,最大的特點是能在o(n)的時間內完成,當然同樣的時間效率也可以用計數排序。

堆排序Heap Sort 其一

時間複雜度 o nlogn 在insert 操作和extractmax 操作中,時間複雜度都是logn級別的,因為shiftup 和shiftdown 操作中,不管是將元素從下到上,從上到下一層層找到合適的位置都是和層序相關的。二叉堆 binary heap 堆總是一顆完全二叉樹 最大堆 大頂堆 堆...

向量的範數及其乙個簡單的應用

所謂向量的範數可以簡單的理解為向量的長度,或者說向量到零點的距離。向量的範數定義 向量的範數是乙個函式 x 滿足非負性 x 0,齊次性 cx c x 三角不等式 x y x y 常用的向量的範數 l1範數 x 為x向量各個元素絕對值之和 l2範數 x 為x向量各個元素平方和的1 2次方,l2範數又稱...

堆排序演算法及其應用

堆積排序是指利用堆積樹 堆 這種資料結構所設計的一種排序演算法,可以利用陣列的特點快速定位指定索引的元素。堆可以被看成是一棵樹,結點在堆中的高度可以被定義為從本結點到葉子結點的最長簡單下降路徑上邊的數目 定義堆的高度為樹根的高度。我們將看到,堆結構上的一些基本操作的執行時間至多是與樹的高度成正比,為...