您的位置:首页 > 职场人生

堆排序

2016-07-14 08:33 169 查看
电话面试被问到堆排序,我也是一脸大写的懵啊~

重敲堆排序,发现根本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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  堆排序 面试