幾種常用的排序方法5 堆排序

2022-08-11 11:39:09 字數 1261 閱讀 7481

堆排序

堆排序是一種原地排序,利用資料結構中的堆來管理資料。

(二叉)堆資料結構是一組陣列物件,它可以被視為乙個完全二叉樹,樹的每個節點與陣列中存放該結點值得那個元素對用。

性質:①父節點:i   左孩子::2*i    右孩子:2*i + 1       (注意:在計算機中可以用移位完成,左孩子是i<<1,右孩子是(i<<1) + 1)

②二叉堆有兩種:最大堆和最小堆,這裡以最大堆為例:除了根以外的每個結點i,有a[parent[i]] >= a[i],即每個結點的值最多與其父結點一樣大。

③當用陣列表示儲存了n個元素的堆時,葉子結點的下標是[n/2]+1, [n/2]+2,......n。

堆排序演算法的主要思想:

①首先初始化乙個最大堆,此最大堆是乙個無序區r[1,2,...n];

②根據最大堆的性質,根結點的元素r[1]一定是最大的元素,將r[1]與r[n]交換,得到新的有序區r[n]和無序區r[1,2,3...n-1];

③將無序區的元素重新再次調整為最大堆,重複②的做法,直到無序區只有乙個元素。

堆排序的時間,主要由建立初始堆和反覆重建堆這兩部分的時間開銷構成,它們均是通過呼叫max_heapify實現的。

堆排序比較適合資料較多的檔案排序

1 #include2 #include3

#define maxn 10000

4void max_heapify(int *a, int i, intn)5

13else largest =i;

14if(r <= n && a[r] >a[largest])

1518

if(largest !=i)

1925}26

27void build_max_heap(int *a, int

n)28

35}

3637

void heapsort(int *a, int n) //

堆排序

38 47}

4849

intmain()

50

60heapsort(a,n);

61for(i = 1; i <= n; i++)

62

65}

66 printf("\n"

);67

//system("pause");

68return

0;

69 }

排序(5) 堆排序

1.堆 堆這種資料結構其實就是完全二叉樹,堆分為兩種,大頂堆和小頂堆。因此,堆是具有下列性質的完全二叉樹 每個節點的值都大於或等於其左右孩子節點的值稱為大頂堆 每個節點的值都小於或等於其左右孩子節點的值稱為小頂堆。2.堆排序演算法 堆排序就是利用堆這種資料結構進行排序的方法。它的基本思想是 將待排序...

排序演算法 5 堆排序

這篇部落格從以下幾個方面來說 什麼是最大堆以及 實現 堆排序基礎 一次優化 提高效率 二次優化 原地堆排序,無需額外空間 1.什麼是最大堆以及 實現 這裡可以參考言簡意賅的部落格 堆與最大堆 2.堆排序基礎 import com.heap.maxheap import utils.createran...

排序演算法5 堆排序

堆排序是利用堆這種資料結構進行的排序。堆通常使用一維陣列來實現,是一種近似完全二叉樹的結構。堆排序分為大根堆和小根堆。堆排序滿足這樣的乙個特性 大根堆父節點的值總是大於子節點,小根堆的父節點值總是小於子節點。我們在拿到乙個陣列時,首先將它構造成為乙個大根堆 小根堆,這個過程我們叫做建堆。然後將根節點...