堆排序
来源:互联网 发布:游戏美工入门 编辑:程序博客网 时间:2024/06/06 03:58
#include<iostream>using namespace std;void duisort(int a[],int parent,int lenth){ int temp = a[parent]; //取父节点的值 int child = parent * 2 + 1; //取第一个子节点,这里默认取左边值 while (child<lenth) { if (a[child] < a[child + 1]) //如果右边的数更大,取右边的数 { child++; } if (a[child] < temp) //如果父节点最大,直接退出循环 { break; } a[parent] = a[child]; //说明子节点比父节点大,将子节点的值赋给父节点,同时父节点的值保存在temp中不会丢失 parent = child; //继续遍历下面的节点,找到适合父节点的位置 child = child * 2 + 1; } a[parent] = temp; //最后将找到的适合父节点的位置给父节点,这个时候说明他的后面已经形成了最大堆}int main(){ int n; cin >> n; int a[50]; for (int i = 0; i < n; i++) { cin >> a[i]; } for (int i = n / 2 - 1; i >= 0; i--) //这里的作用是形成最大堆,从最后一个有孩子的子节点开始,向前遍历,这样可以保证生成最大堆 { duisort(a, i, n); } for (int i = 0; i < n; i++) { cout << a[i] << " "; } cout << endl; for (int i = n-1; i >0;) //这个时候a[0]已经是堆中最大的数,所以将其交换,同时再一次的进行堆运算,由于已经生成了最大堆,所以这个时候可以保证能够一次生成最大堆 { int temp = a[0]; a[0] = a[i]; a[i--] = temp; //交换两个数的位置 duisort(a, 0, i); //这里在进行最大堆的运算 } for (int i = 0; i < n; i++) { cout << a[i] << " "; } cout << endl; return 0;}
阅读全文
0 0
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- ScrollView起始位置不是最顶部的解决办法
- 两种上传头像的方式(file文件)
- 基于ssm的在线(论坛【拟定】)系统
- Apache Commons 工具类介绍
- 《视觉SLAM十四讲》之开源库的安装
- 堆排序
- 自顶向下,逐步求精
- synchronized锁的优化
- Java入门 简易计算器
- 暂时解决安装tensorflow后spyder不能代码补齐的功能,多anaconda环境安装
- GCC 编译错误 relocation truncated to fit: R_X86_64_32S against `.bss'
- I/O函数
- PLSQL定时器ORA-12011问题解决
- centos7+tomcat部署JavaWeb项目