1. 程式人生 > 實用技巧 >堆排序-C++

堆排序-C++

堆排序(Heapsort)是指利用堆這種資料結構所設計的一種排序演算法。堆積是一個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。

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


//節點調整
void adjustHeap(int arrays[],int i,int len){
    int temp = arrays[i];//先取出當前元素i
    for(int k=i*2+1;k<len;k=k*2+1){//從i結點的左子結點開始,也就是2i+1處開始
        if(k+1
<len && arrays[k]<arrays[k+1]){//如果左子結點小於右子結點,k指向右子結點 k++; } if(arrays[k] >temp){//如果子節點大於父節點,將子節點值賦給父節點(不用進行交換) arrays[i] = arrays[k]; i = k; }else{ break; } } arrays[i] = temp;//將temp值放到最終的位置 } //調整為大頂堆
void adjustTree(int arrays[],int len){ for(int i=len/2-1;i>=0;i--){ //調整節點 adjustHeap(arrays,i,len); } } void swap(int arrays[],int a ,int b){ int temp=arrays[a]; arrays[a] = arrays[b]; arrays[b] = temp; } //排序,經過一次調整以後,第一個位子的數最大 void heapsort(int arrays[],int len){ adjustTree(arrays,len);
for(int j=len-1;j>0;j--){ swap(arrays,0,j);//將堆頂元素與末尾元素進行交換 adjustHeap(arrays,0,j);//重新對交換的這一個枝節進行調整 } } int main(){ clock_t time_start=clock(); int arrays[10]={5,8,6,3,4,7,9,1,0,2}; heapsort(arrays,10); for(int a:arrays){ cout<<a<<endl; } clock_t time_end=clock(); cout<<1000*(time_end-time_start)/(double)CLOCKS_PER_SEC<<"ms"<<endl; }