堆排序的簡單實現
阿新 • • 發佈:2018-12-11
堆排序演算法
#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