1. 程式人生 > >堆排序的簡單實現

堆排序的簡單實現

堆排序演算法

#include<iostream>//忽略c++首尾及輸出 
using namespace std;
/*
arr為一棵完全二叉樹
i為預設最大值
size為樹的結點個數 
*/ 
void three_max(int arr[],int i,int size){
/*
	函式功能:將父節點與子節點比較,實現父節點大於子節點 
*/
	if(i<size){
		int left=2*i+1;
		int right=2*i+2;
		int largest=i;
		if(left<size){
			if(arr[largest]<arr[left]){
				largest=left;
			}
		}
		if(right<size){
			if(arr[largest]<arr[right]){
				largest=right;
			}
		}
		if(largest!=i){
			int temp=arr[largest];
			arr[largest]=arr[i];
			arr[i]=temp;
			three_max(arr,largest,size);
		}
	}
}
void heap(int arr[],int size){//建堆過程,實現所有結點滿足堆的條件 
	for(int i=size-1;i>=0;i--){
		three_max(arr,i,size);
	}
}
void heap_sort(int arr[],int size){//不斷的將每次篩選出的最大值切斷,遞迴建堆 
	for(int i=size-1;i>=0;i--){
		heap(arr,i+1);
		int temp=arr[0];
		arr[0]=arr[i];
		arr[i]=temp;
	}
}
int main(){
	int arr[]={12,345,6,8,0,9,56789};
	heap(arr,7);//每次將最大值放到陣列的前面 
	for(int j=0;j<7;j++){
		cout<<arr[j]<<" ";
	}
	cout<<endl;
	heap_sort(arr,7);//堆排完成 
	for(int i=0;i<7;i++){
		cout<<arr[i]<<" ";
	}
	return 0;
}

可能,要恭喜那個看得懂的你了,寫的不好,多擔待!(看大佬的視屏學的,哈哈!!!)       

                                                                                                                                       L-MP