1. 程式人生 > 實用技巧 >資料結構:堆排序

資料結構:堆排序

簡單介紹

堆排序就是利用堆這一資料結構來排序,堆使一顆完全二叉樹,每個結點都不大於或者不小於他的兒子。關於排序的話,我們每次取出堆頂元素和堆尾的交換,然後由剩下的元素重新構建堆,最後我們將得到一個有序的序列。

Code

#include<bits/stdc++.h>
using namespace std;

void heap_adjust (int r[],int low,int high) {
	int i=low;
	int j=2*low+1;
	int temp=r[low];
	while (j<high) {
		if (j<high&&r[j]<r[j+1]) j++;  //每輪只需要對兩個兒子進行操作,所以取大的操作比較一次就可以了
		if (temp<r[j]) {
			r[i]=r[j];
			i=j;
			j=2*i+1;   //調整位置繼續構建堆
		}
		else break;
	}
	r[i]=temp;   //temp賦值給最後一個
	return ;
}

void heap_sort (int r[],int n) {
	int i;
	int temp;
	for (int i=n/2-1;i>=0;i--) heap_adjust (r,i,n-1); //最底層非葉子結點開始調整
	for (int i=n-1;i>=1;i--) {
		swap (r[0],r[i]);
		heap_adjust (r,0,i-1);   //此時下面均為有序,所以要從堆頂開始調整
	}
	return ;
}

int main () {
	int R[8]={49,38,65,97,76,13,27,49};
	heap_sort (R,8);
	for (int i=0;i<8;i++) printf ("%d ",R[i]);
	printf ("\n");
	return 0;
}