堆排序
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;
}
重敲堆排序,发现根本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;
}
相关文章推荐
- 堆排序
- 只有程序员看的懂的面试圣经|如何拿下编程面试
- 下一次技术面试时要问的 3 个重要问题
- PHP程序员面试 切忌急功近利(更需要注重以后的发展)
- C#堆排序实现方法
- C#常见算法面试题小结
- php 面试碰到过的问题 在此做下记录
- asp.net 面试+笔试题目第1/2页
- 图文详解Heap Sort堆排序算法及JavaScript的代码实现
- php堆排序实现原理与应用方法
- C++堆排序算法的实现方法
- C语言实现基于最大堆和最小堆的堆排序算法示例
- 深入理解堆排序及其分析
- C语言对堆排序一个算法思路和实现代码
- 理解二叉堆数据结构及Swift的堆排序算法实现示例
- Python实现堆排序的方法详解
- asp.net 面试 笔试题目[附答案]第1/3页
- 详解堆排序算法原理及Java版的代码实现
- Java实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等
- JAVA算法起步之堆排序实例