堆排序(這裡使用的是最大堆)
思想:1、將當前的堆轉換成最大堆(從最大的非葉子結點開始,(1)判斷根結點和左右結點的大小交換相互的位置,
使得該子樹成為最大堆,每次交換成功後就繼續往該結點的子結點去重複(1)操作,直到根結點後再去下乙個非葉子結點,直到根結點)
2、轉成最大堆後,每次就將第乙個結點互最後乙個結點進行交換,然後將整個堆的長度減去1
(因為最後乙個結點就是整個陣列中最大的元素,即就是已經排序好的結點)
3、重複1、2的操作,直到堆中的元素都排序好了
**如下:
#include using namespace std;
int data = ;//測試示例
void changemaxhead(int len)
if (rightindex <= len && data[rightindex - 1] > data[maxindex - 1])
if (maxindex != temp)
else break;
} }}void head_sort(int len)
}int main()
puts("");
return 0;
}//輸出 10 20 30 40 50 60 70 80 90
最大堆 排序
解除安裝最前面,下面的所有討論都是基於二叉堆 一 什麼是堆 堆是乙個陣列結構,可以看著為一顆完全二叉樹,把這顆完全二叉樹按層從上到下,每層從左至右編序號,每個序號所對應的元素即為陣列中該序號的元素 該樹出最後一層以外每一層都排滿,最後一層從左至右,先左孩子再右孩子排列,如果有父節點沒有排滿孩子 無孩...
最大堆排序
其實堆排序就是對二叉樹的一種操作,使得二叉樹的左右孩子 節點都小於父節點。我使用的是陣列的實現方式,parent i return i 2 i的父節點下標,left i return 2 i i的左子節點 right i return 2 i 1 i的右子節點.以上均為陣列元素的標號位置,在訪問元素...
實現最大堆和堆排序
最大堆 最大堆 堆中某個節點的值總是不大於其父節點的值,可以使用陣列實現 按層,從上到下,從左到有,為節點序號i 往堆中增加元素的操作 往陣列末尾增加,如果比父節點大,則交換,同理,一直到根節點 該操作稱為siftup 去除最大堆根元素的操作 將根元素去除,將最後乙個元素放在根元素的位置,比較根元素...