//問題 A DS內排—堆排序.cpp:此文件包含 "main" 函數。程序執行將在此處開始並結束。
//
//#include "pch.h"
#include <iostream>
#include<iostream>
using namespace std;
void heapAdjust(int arr[],int s,int m)
{
int j;
for (j = 2 * s; j <=m; j *=2) //s節點是根節點
{
if (j<m && arr[j]>arr[j + 1]) //大於號或小於來決定小頂堆或者大頂堆,就是找到左右節點裏的大的或小的節點。
j++;
if (arr[s]<=arr[j]) //這裏是小頂堆,如果根節點就是最小的話,不需要交換,直接break出循環。
break;
swap(arr[s],arr[j]);
s = j; //繼續交換。
}
}
void print(int arr[], int n)
{
cout << n;
for (int i = 1; i <= n; i++)
cout << " " << arr[i];
cout << endl;
}
void heapSort(int arr[],int n)
{
int i;
for (i =n/2;i>0; i--) //只需要考慮樹的非葉子節點即可,因爲建堆的時候要考慮孩子節點,考慮葉子節點沒有意義,因此從n/2開始。
heapAdjust(arr,i,n); //把亂序的二叉樹變成大頂堆或者小頂堆(大或者小頂對由題目來定,在heapAdjust函數內部考慮。)
print(arr,n);
for (i = n; i >1; i--)
{
swap(arr[1],arr[i]); //交換根節點(最大或者最小)和最後一個節點。
heapAdjust(arr,1,i - 1); //把除了最後一個節點以外的節點重新建成堆。
print(arr,n);
}
}
int main()
{
int n;
cin >> n;
int arr[100];
for (int i = 1; i <=n; i++) //從0開始和從1開始都一樣,只要注意在通過雙親節點來找子節點的時候的公式就行。
cin >> arr[i];
heapSort(arr, n);
}
堆排序 heapsort
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.