【C++单排之路】基本排序算法--堆排序

1.堆排序

1.1 构建最大堆


1.2 堆排序



1.3 代码及注释

//堆排序,时间复杂度为O(nlogn)
//堆排序中的堆指的是最大堆
#include<iostream>
using namespace std;
//交换
void exchange(int &a,int &b){
    int temp;
    temp = a;
    a= b;
    b= temp;
}
//调整最大堆,这个函数假定以pos位置作为根节点,其左右子数都是最大堆。仅仅只有a[pos]与其两个(或者只有左孩子)孩子a[2*pos]和a[2*pos+1]的大小关系不确定。需要以pos为根,自上而下的递归调整
void Max_Heapify(int *a,int pos,int len){  //这里的len的作用,在构建最大堆时为原数组的大小10,由于堆排序是原址排序,已排序好的放在数组最后,因此数组的待排序长度需要递减
    int l= 2*pos;
    int r= 2*pos+1;
    int largest = pos;
    if((l<=len)&&(a[l]>a[pos])){
        largest = l;
    }
    if((r<=len)&&(a[r]>a[largest])){
        largest = r;
    }
    if(largest!=pos){
        exchange(a[pos],a[largest]);
        Max_Heapify(a,largest,len);
    }
}
//建立最大堆,从第一个非叶节点开始直到根节点
void Build_Max_Heap(int *a){
    for(int i=5;i>=1;i--){
        Max_Heapify(a,i,10);
    }
}
//输出
void printHeap(int *a){
    for(int i=1;i<=10;i++){
        cout<<a[i]<<"  ";
    }
    cout<<endl;
}
//堆排序海曙,首先建立堆,每次把最大堆的根节点与待排序的最后一个元素做交换,待排序的长度递减,这样同时也会破坏最大堆,所以每次还需要从根节点开始调整最大堆
void Heap_Sort(int *a){
    Build_Max_Heap(a);//首先要建立最大堆
    exchange(a[1],a[10]);
    for(int i=9;i>1;i--){ //循环n-2次
        Max_Heapify(a,1,i);
        exchange(a[1],a[i]);
    }
    printHeap(a);
}
//主函数
int main(){
    int array[] = {0,4,1,3,2,16,9,10,14,8,7}; //待排序数组,这个数组的0号元素不存放数据,不参与排序,目的是为了满足节点与其子节点的下标对应关系
//                                              (若一个节点下标为pos,则2*pos为其左孩子,2*pos+1为它的右孩子,pos/2为它的父节点)
    Heap_Sort(array);
    system("pause");
    return 0;
}

1.4 结果


猜你喜欢

转载自blog.csdn.net/qq_37935670/article/details/80086658
今日推荐