堆排序,cpp实现
来源:互联网 发布:算法设计 pdf 编辑:程序博客网 时间:2024/05/17 09:12
#include <iostream>
using namespace std;
void swap(int &a,int &b){
int temp = a;
a = b;
b = temp;
}
/*初始建堆,实为对孩子所在列的插入排序*/
void buildHeap(int a[],int length){
for(int i=1;i<length;++i){
int parent = i;
for(int j=(parent-1)/2;j>=0&&parent!=0;parent=j,j=(parent-1)/2){
if(a[j]<a[parent]){
swap(a[j],a[parent]);
}
}
}
}
/*在每次删除顶部元素后恢复堆,本质上从顶部开始,和左右孩子较大的孩子交换,一直到不能交换为止,时间效率为log2n*/
void recoverHeap(int a[],int size){
int parent = 0;
for(int l=1,r=2;parent<size/2;l=2*parent+1,r=2*parent+2){
int max;
if(r<size&&a[l]<a[r]){
max = r;
}else{
max = l;
}
if(a[max] > a[parent]){
swap(a[max],a[parent]);
parent = max;
}else{
return ;
}
}
}
/*堆排序*/
void sortHeap(int a[],int length){
buildHeap(a,length);
for(int i = length-1;i>0;--i){
/*逻辑上删除顶部元素*/
swap(a[i],a[0]);
/*恢复堆*/
recoverHeap(a,i);
/*查看每次排序后的结果*/
for(int i=0;i<10;++i){
cout << a[i] << " ";
}
cout << endl;
}
}
int main(int argc, char const *argv[])
{
int a[10] = {3,1,2,8,7,5,9,4,6,0};
sortHeap(a,10);
return 0;
}
using namespace std;
void swap(int &a,int &b){
int temp = a;
a = b;
b = temp;
}
/*初始建堆,实为对孩子所在列的插入排序*/
void buildHeap(int a[],int length){
for(int i=1;i<length;++i){
int parent = i;
for(int j=(parent-1)/2;j>=0&&parent!=0;parent=j,j=(parent-1)/2){
if(a[j]<a[parent]){
swap(a[j],a[parent]);
}
}
}
}
/*在每次删除顶部元素后恢复堆,本质上从顶部开始,和左右孩子较大的孩子交换,一直到不能交换为止,时间效率为log2n*/
void recoverHeap(int a[],int size){
int parent = 0;
for(int l=1,r=2;parent<size/2;l=2*parent+1,r=2*parent+2){
int max;
if(r<size&&a[l]<a[r]){
max = r;
}else{
max = l;
}
if(a[max] > a[parent]){
swap(a[max],a[parent]);
parent = max;
}else{
return ;
}
}
}
/*堆排序*/
void sortHeap(int a[],int length){
buildHeap(a,length);
for(int i = length-1;i>0;--i){
/*逻辑上删除顶部元素*/
swap(a[i],a[0]);
/*恢复堆*/
recoverHeap(a,i);
/*查看每次排序后的结果*/
for(int i=0;i<10;++i){
cout << a[i] << " ";
}
cout << endl;
}
}
int main(int argc, char const *argv[])
{
int a[10] = {3,1,2,8,7,5,9,4,6,0};
sortHeap(a,10);
return 0;
}
阅读全文
0 0
- 堆排序,cpp实现
- 算法导论第六章-堆排序-Cpp代码实现
- 【排序】堆排序实现
- 用堆实现堆排序
- Python实现 [堆] [堆排序]
- 最大堆实现堆排序
- 堆以及堆排序实现
- 堆实现 及 堆排序
- 最大堆实现堆排序
- 冒泡排序法,cpp实现
- 堆排序的实现
- 堆排序的实现
- 堆排序实现...
- 堆排序的实现
- 堆排序实现
- 堆排序算法实现
- 堆排序的实现
- 堆排序实现
- 根据指定文字生成图片
- JAVA日期工具类
- 【HDU 3336】Count the string(kmp)
- Java 社区
- java 怪胎之 String
- 堆排序,cpp实现
- 素数回文5到一亿
- axios资料整理
- ubuntu 14.04 LTS Docker安装(转载)
- spring boot 笔记(四):返回静态页面
- 深度学习:MATLAB 入门系列(一)
- css复习整理(一):选择器与创建
- Gerrit安装配置
- HDU 4763 Theme Section(kmp求前后缀)