堆排序-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;
}

 

posted @ 2020-11-05 13:46  苗头hhh  阅读(127)  评论(0)    收藏  举报