堆排序
堆排序是一種原地排序,利用資料結構中的堆來管理資料。
(二叉)堆資料結構是一組陣列物件,它可以被視為乙個完全二叉樹,樹的每個節點與陣列中存放該結點值得那個元素對用。
性質:①父節點: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 堆排序
堆排序是利用堆這種資料結構進行的排序。堆通常使用一維陣列來實現,是一種近似完全二叉樹的結構。堆排序分為大根堆和小根堆。堆排序滿足這樣的乙個特性 大根堆父節點的值總是大於子節點,小根堆的父節點值總是小於子節點。我們在拿到乙個陣列時,首先將它構造成為乙個大根堆 小根堆,這個過程我們叫做建堆。然後將根節點...