堆排序(heap_sort)

一、學習要點:
1.什麼是堆?
a.完全二叉樹;
b.子樹滿足根節點數值小於左右子節點數值,爲最小堆;滿足根節點數值大於左右子節點數值,爲最大堆;
2.怎麼維護堆的結構:
a.每一個子樹都應該維護堆結構;
b.自下而上維護堆的結構;【(5,6,3,7,8)至上而下的維護,不能將最大的值放到最前頭;】
3.堆排序:
不斷的構建完整的堆結構;將最大的元素arr[0]與arr[size-1]進行交換;對交換後的arr[size-1]在構建堆結構;將最大的元素arr[0]與arr[size-2]進行交換,重複進行。
二、代碼:

#include<iostream>
using namedpace std;
void heapdown(int *arr,int n,int i)
{
	int left=2*i+1;
	int right=2*i+2;
	int max=i;
	if(left<=n-1&&arr[left]>arr[max])
	{
		max=left;
	}
	if(right<=n-1&&arr[right]>arr[max])
	{
		max=right;
	}
	if(max!=i)
	{
		int temp=arr[i];
		arr[i]=arr[max];
		arr[max]=temp;
		heapdown(arr,n,max);
	}
}
void headup(int *arr,int n)
{
	for(int i=(n-1-1)/2;i>=0;i--)
	{
		heapdown(arr,n,i);
	}
}
void heapsort(int* arr,int n)
{
	for(int i=n;i>0;i--)
	{
		heapup(arr,i);
		int temp=arr[0];
		arr[0]=arr[i-1];
		arr[i-1]=temp;
	}
}
int main()
{
	int a[10] = { 9,8,5,6,3,4,7,1,2,10 };
	heapsort(a,10);
	for (int i = 0; i < 10; i++)
	 {
	  	cout << a[i] << endl;
	 }
	 system("pause");
	 return 0;
	}

三、運行結果:
在這裏插入圖片描述

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