1.堆排序
1)首先將序列構建爲大頂堆 ;
2)取出當前大頂堆的根結點,將其與序列末尾元素進行交換(此時末尾元素爲已排序序列的最大值);
3)對交換後的n-1個序列元素進行調整,使其滿足大頂堆的性質;
4)重複2、3步驟,直到堆中只有一個元素位置
2.數據結構-堆
詳見 數據結構-堆
3.算法
//遞歸方式構建堆,parent爲第一個非葉子結點下標,num爲數組個數
void buildHeap(int *arr, int num,int parent)
{
// parent的左子節點
int sonLeft = 2 * parent + 1;
// parent的右子節點
int sonRight = 2 * parent + 2;
int temp = parent;
//判斷左右孩子和父親中的最大值,獲取下標索引值
if (sonRight < num && arr[sonRight] > arr[temp])
{
temp = sonRight;
}
if (sonLeft < num && arr[sonLeft] > arr[temp])
{
temp = sonLeft;
}
if (temp != parent)
{
swap(arr[temp], arr[parent]);
buildHeap(arr, num, temp);
}
}
//堆排序
void heapSort(int *arr, int num)
{
// 構建大根堆(從最後一個非葉子節點向上)
for (int i = num / 2 - 1; i >= 0; i--)
{
buildHeap(arr, num, i);
}
//先將第一個元素和已經排好的元素前一位做交換,再從新調整(剛調整的元素之前的元素),直到排序完畢
for (int i = num - 1; i > 0; i--)
{
swap(arr[0], arr[i]);
buildHeap(arr, i ,0);
}
}
int main()
{
int a[] = { 9,1,2,0,5,7,4,8,6,3,5 };
cout << "排序前: " << endl;
printArr(a, 11);
heapSort(a, 11);
cout << "\n";
cout << "排序後: " << endl;
printArr(a, 11);
return 0;
}