堆排序,图解,C/C++实现
body, table{font-family: 微软雅黑; font-size: 13.5pt}
table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;}
th{border: 1px solid gray; padding: 4px; background-color: #DDD;}
td{border: 1px solid gray; padding: 4px;}
tr:nth-child(2n){background-color: #f8f8f8;}
|
大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]
小顶堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]
|
|
#include<iostream>
using namespace std;
int headSort(int* arr,int length);
void adjust(int* arr,int idx1,int idx2);
void swap(int& a,int& b);
int main()
{
int arr[9] = {50,10,90,30,70,40,80,60,20};
for(int idx=0;idx!=9;++idx)
cout<<arr[idx]<<" ";
cout<<endl;
headSort(arr,9);
for(int idx=0;idx!=9;++idx)
cout<<arr[idx]<<" ";
cout<<endl;
system("pause");
}
void swap(int& a,int& b)
{
int tmp = a;
a = b;
b = tmp;
}
|
//堆排序,数组下标对应其在堆数据结构中的结点位置,从0开始编号,堆是完全二叉树
int headSort(int* arr,int length)
{
if(nullptr==arr||length<=0)
return -1;
//数组中顺序存放的数据就对应完全二叉树堆中的对应结点的值,现在调整为大根堆
for(int idx=length/2-1;idx>=0;--idx) //从最后一个非叶子结点开始调整为最大堆
{
adjust(arr,idx,length-1); //最后一个非叶子结点和它的孩子比较调整
}
//排序,根结点后最后一个结点交换,调整
for(int idx=length-1;idx>0;--idx)
{
swap(arr[0],arr[idx]); //每次选出一个最大的数放到末尾,也就是数组末尾
adjust(arr,0,idx-1); //调整根结点到idx-1个结点为大根堆
}
return 0;
}
void adjust(int* arr,int idx1,int idx2)
{
if(nullptr==arr||idx1>=idx2||idx1<0||idx2<0)
return ;
int tmp = arr[idx1]; //暂时存放要调整的数据
for(int idx=idx1*2+1;idx<=idx2;idx=idx*2+1) //从要调整的数据的左孩子开始比较
{
//选出左右孩子中的最大结点
if(idx+1<=idx2 && arr[idx]<arr[idx+1])
++idx;
if(arr[idx]>tmp) //不满足大根堆,调整
{
arr[idx1] = arr[idx]; //交换,可能破坏子树满足大根堆的性质
idx1 = idx; //本来这里要交换的,但时tmp暂时存放了初始arr[idx1]的值,这里每次比较都是和tmp比较,好比交换了,所以可以不用先交换
//继续向下调整,直到树满足大根堆性质
}
else
break;
}
arr[idx1] = tmp;
}
|
堆排序,图解,C/C++实现的更多相关文章
- 七种常见经典排序算法总结(C++)
最近想复习下C++,很久没怎么用了,毕业时的一些经典排序算法也忘差不多了,所以刚好一起再学习一遍. 除了冒泡.插入.选择这几个复杂度O(n^2)的基本排序算法,希尔.归并.快速.堆排序,多多少少还有些 ...
- leetcode 排序问题
1.堆排序 //大顶堆的构造,传入的i是父节点 void HeapAdjust(int k[],int p,int n) { int i,temp; temp = k[p]; * p; i <= ...
- 找工作面试题记录与参考资料(Golang/C++/计算机网络/操作系统/算法等)
记录下去年(2020年)找工作的面试题及参考资料. C++ 智能指针的实现原理 多态的实现原理[2] C++11/14/17新特性[3] 手写memcpy和memmove[4] 介绍下boost库 计 ...
- 排序图解:js排序算法实现
之前写过js实现数组去重, 今天继续研究数组: 排序算法实现. 排序是数据结构主要内容,并不限于语言主要在于思想:大学曾经用C语言研究过一段时间的排序实现, 这段时间有空用JS再将排序知识点熟悉一遍. ...
- 堆排序HeapSort
堆排序,顾名思义,是采用数据结构堆来进行排序的一种排序算法. 研究没有规律的堆,没有任何意义.特殊的堆有最大堆(父节点值大于等于左右字节点值),最小堆(父节点值小于等于子节点值).一般采用最大堆来进行 ...
- 数据结构与算法之PHP排序算法(堆排序)
一.堆的定义 堆通常是一个可以被看做一棵树的数组对象,其任一非叶节点满足以下性质: 1)堆中某个节点的值总是不大于或不小于其父节点的值: 每个节点的值都大于或等于其左右子节点的值,称为大顶堆.即:ar ...
- 堆排序(大顶堆、小顶堆)----C语言
堆排序 之前的随笔写了栈(顺序栈.链式栈).队列(循环队列.链式队列).链表.二叉树,这次随笔来写堆 1.什么是堆? 堆是一种非线性结构,(本篇随笔主要分析堆的数组实现)可以把堆看作一个数组,也可以被 ...
- Python 堆与堆排序
堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法.学习堆排序前,先讲解下什么是数据结构中的二叉堆. 二叉堆的定义 二叉堆是完全二叉树或者是近似完全二叉树. 二叉堆满足 ...
- C语言堆排序
堆是一种类似二叉树的数据结构,分为最大堆和最小堆,最大堆得定义是当前节点必须大于左右子节点,堆中所有节点都要符合这个定义.最小堆反之.这一点不同于二叉树排序.假设有数组int a[10] = {90, ...
随机推荐
- Codeforces 1005 E2 - Median on Segments (General Case Edition)
E2 - Median on Segments (General Case Edition) 思路: 首先我们计算出solve(m):中位数大于等于m的方案数,那么最后答案就是solve(m) - s ...
- JAVA基础知识总结:十四
一.泛型 1.概念 泛型指的是泛指的类型.主要用于子类和父类,接口和实现类之间的数据传递 JDK1.5之后新增的特性,主要用于解决安全问题,是一个安全机制 好处: a.可以提高代码的复用性 b.避免了 ...
- RPG游戏中如何判断敌人是否在玩家的攻击范围之内
// 方式1:通过主角和场景中的所有敌人比较 private void AtkCondition1(float _range,float _angle) { // 搜索所有敌人列表(在动态创建敌人时生 ...
- https 学习笔记
参考 : http://www.cnblogs.com/JimmyZhang/archive/2008/10/02/Cryptograph.html https://blog.csdn.net/Jog ...
- 量化投资的Python库——Tushare
本来想用python自带的help命令和dir命令,来写一个关于Tushare库的使用手册呢,但是后来发现了Tushare的官方网站, ̄□ ̄||,网址如下: http://tushare.org/ 把 ...
- c# HTML中提取图片地址
public class HtmlHelper { /// <summary> /// HTML中提取图片地址 /// </summa ...
- 基于bootstrap模态框的日期选择器
近来由于工作需求,以bootstrap模态框+DIV+CSS+JS做了一个适用于移动端的日期选择器,能够满足多样的需求,目前处于第一个版本,后续可能会继续更新.废话不多说,直接进入制作过程. 首先,需 ...
- int __get_order(unsigned long size)
2017-12-6 10:26:504.9.51int __get_order(unsigned long size){ int order; size--; size >>= ...
- H5微信页面开发 IOS系统 input输入框失去焦点,软键盘关闭后,被撑起的页面无法回退到原来正常的位置,导致弹框里的按钮响应区域错位
H5微信页面开发,软键盘弹起后,若原输入框被遮挡,页面整体将会上移,然而当输入框失焦,软键盘收起后,页面未恢复,导致弹框里的按钮响应区域错位. 解决方案:给输入框(或select选择框)添加失去焦点的 ...
- P3489 付公主的背包
题意:n<=1e5,m<=1e5,跑n个物品1到m容量的完全背包. 考虑暴力的做法就是把一些1/(1+x^a)的多项式乘起来即可. 考虑优化,取一下ln,转化为加法,然后exp回去就好了.