堆是具備如下性質的徹底二叉樹:每一個結點的值都大於或等於左右孩子結點的值,稱之爲大頂堆,或者每一個結點的值都小於或等於左右孩子結點的值,稱之爲小頂堆。堆排序由如下步驟構成:數組
1.將無序序列構建成一個堆,根據升序降序需求選擇大頂堆或小頂堆。ui
2.將堆頂元素與末尾元素進行交換-將最大元素「沉」到數組末端code
3.從新調整結構,使其知足堆的定義,而後繼續交換堆頂與當前末尾元素。直到整個序列有序。排序
//堆排序 /*******************************************************************/ //調整堆爲大頂堆 void adjustHeap(int *a,int i, int size) { int lchild = 2 * i; //左孩子 int rchild = 2 * i + 1; //右孩子 int maxIndex = i; //最大值的下標 if (i<=size/2) { if (lchild <= size && a[lchild] > a[maxIndex]) { maxIndex = lchild; } if (rchild <= size && a[rchild] > a[maxIndex]) { maxIndex = rchild; } if (maxIndex != i) { int temp = a[maxIndex]; a[maxIndex] = a[i]; a[i] = temp; adjustHeap(a, maxIndex, size); //i<=size/2是防止此處對葉子節點進行調整 } } } //創建大頂堆 void buildHeap(int *a, int size) { int parentNode = size / 2; //最大非葉子節點 for (int i=parentNode;i>=1;i--) { adjustHeap(a, i, size); } } //堆排序實現 void heapSort(int *a, int size) { for (int i=size;i>1;i--) { buildHeap(a, i); int temp = a[i]; a[i] = a[1]; a[1] = temp; } }