堆排序 heapsort

//問題 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);
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章