堆排序

电话面试被问到堆排序,我也是一脸大写的懵啊~


重敲堆排序,发现根本so easy啊


两个步骤:

1.初始化建堆

2.取出堆的根并对剩下结构进行调整

#include<iostream>
#include<string>
#include<cstring>
const int sizes=10;
using namespace std;

/*
 *小根堆为例
 *author by delia
*/
int data[sizes];

void swapData(int & data1 , int & data2){
    int temp = data1;
    data1 = data2;
    data2 = temp;
}

/*
 *父节点序号 = (孩子节点序号-1)/2 (序号的问题可以自己画一个0序号开始的堆来试一下)
 *while循环找位置的过程中注意0的边界情况,避免死循环
*/
void dataUp(int num){
    int value = data[num];
    int father_num = (num-1) / 2;
    while(num!=0 && data[father_num]>value){
        data[num] = data[father_num];
        num = father_num;
        father_num = (father_num-1)/2;
    }
    data[num] = value;
}

void addData(int num , int new_data){
    data[num] = new_data;
    dataUp(num);
}

/*
 *子节点序号 = 2*孩子节点序号+1
 *while循环找位置的过程中注意num的边界情况,避免出界
*/
void dataDown(int num){
    int i = 0;
    int value = data[0];
    int c1 = 2 * i+1;

    while(c1<=num){
        if(c1+1<=num && data[c1]>data[c1+1]){
            c1 = c1+1;
        }
        if(data[c1]>=value) break;
        data[i] = data[c1];
        i = c1;
        c1 = 2*i+1;
    }
    data[i] = value;
}

void deleteData(int num){
    swapData(data[0],data[num]);
    dataDown(num-1);
}

/*
 *初始化建堆函数
 *逐步向堆中添加元素(add函数中实现堆结构的维护)
 *输出结果
*/
void  buildHeap(int *in){
    for(int i = 0 ; i < sizes ; i++){
        addData(i,in[i]);
    }
    for(int i=0;i<10;i++)
        cout<<i+1<<"heap element is :"<<data[i]<<endl;
}

/*
 *逐步输出堆得根元素(即最小值)
 *并将堆的根与堆的尾互换
 *删除堆尾,并重新调整堆平衡
*/
void heapSort(){
    for(int i = 9 ; i>=0 ; i--){
        cout<<data[0]<<"  ";
        deleteData(i);
    }
}

int main()
{
    //要进行排序的数据
    int in[sizes]={88,99,44,43,12,56,89,91,6,3};
    memset(data,0,sizeof(data));

    //初始化建堆
    buildHeap(in);

    //堆排序
    heapSort();

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值