堆排序,图解,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, ...
随机推荐
- 关于Python中的ifelse、while和for循环的简单小结
1.ifelse 1.1首先简单编辑一个关于ifelse的程序: _username = 'yanfeixu' _password = 'wuyifan' username = input(" ...
- 关于类、方法、对象(实例):通过一个例子看一下self都做了哪些事情
我们在定义一个类时,经常会在类的各个方法中看到self,那么在程序执行时self到底起了什么作用,什么时候要加self,这一点需要我们思考并好好理解.之前在学习时没有想这么多,加之用pycharm写代 ...
- iTunes , iCloud 用吐了也没把照片给备份好
下载了iTools ,轻松就倒出来了. Apple这是怎么了,还能不能正常用了? 以前iCloud出来以前,[同步]这个功能,理解起来虽然费劲,还算是能用的. 这回直接就没法倒出照片了?
- 雷林鹏分享:jQuery EasyUI 窗口 - 窗口与布局
jQuery EasyUI 窗口 - 窗口与布局 Layout 组件可以内嵌在窗口(window)中.我们可以创建一个复杂的布局窗口,甚至不需要写任何的 js 代码.jquery-easyui 框架帮 ...
- 20171205xlVBA往返航班组合
'ClassPlan Public Org As String Public Des As String Public FlyNo As String Public StartDate As Vari ...
- P5157 [USACO18DEC]The Cow Gathering
首先考虑怎么check一个点是否能被最后一个删除. 可以这么建图,以这个点建有根树,边全部向上指,再加上剩下的有向边. 很明显,这里的一条边的定义就变成了只有删去这个点,才可以删去它指向的点. 因此, ...
- C++笔试题总结
1.C和C++的特点与区别? 答:(1)C语言特点:1.作为一种面向过程的结构化语言,易于调试和维护: 2.表现能力和处理能力极强,可以直接访问内存的物理地址: 3.C语言实现了对硬件的编程操作,也适 ...
- 338. Counting Bits_比特位计数_简单动态规划
https://leetcode.com/problems/counting-bits/ 这是初步了解动态规划后做的第一道题,体验还不错... 看完题目要求后,写出前10个数的二进制数,发现了以下规律 ...
- Create JSON by Jackson API(转)
原文地址: Create JSON by Jackson API Jackson API is a multi-purpose Java library for processing JSON. ...
- nginx源码安装教程(CentOS)
1.说明 官方源码安装说明:http://nginx.org/en/docs/configure.html 源码包下载地址:http://nginx.org/en/download.html 版本说明 ...