堆排序,图解,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, ...
 
随机推荐
- 雷林鹏分享:现实生活中的 XML
			
现实生活中的 XML 如何使用 XML 来交换信息的一些实例. 实例:XML 新闻 XMLNews 是用于交换新闻和其他信息的规范. 对新闻的供求双方来说,通过使用这种标准,可以使各种类型的新闻信息通 ...
 - mybatis ----> 各种方式使用MBG
			
1.maven方式使用 配置好.pom文件 ①src/main/resources下创建 generatorConfig.xml,并配置好(自动生成的配置文件骨架) ②src/main/java 下创 ...
 - linux进程管理之信号控制
			
使用信号控制进程 ====================================================================================kill,ki ...
 - 腾讯tOS死亡或注定,为何国内无自主ROM?
			
http://tech.sina.com.cn/roll/2017-06-26/doc-ifyhmtrw4006354.shtml 腾讯OS死亡或注定,为何国内无自主ROM? 2017年06月26日 ...
 - 走起 ~私有gitlab
			
1.创建gitlab 账号,创建一个项目名称 地址:http://git.limikeji.com 2.配置git环境 用git命令上传代码 3.配置gitlab ssh 4.使用git命令上传代码 ...
 - layui 导出表格数据
			
第一种方法没试过,有机会要试试.
 - Windows文件共享自动失效解决办法
			
右键共享文件夹>>高级共享>>权限>>添加Everyone 安全选项卡>>添加>>高级>>立即查找>>添加Every ...
 - vue中v-for和动态src问题及解决办法
 - python-django rest framework框架之dispatch方法源码分析
			
1.Django的 CBV 中在请求到来之后,都要执行dispatch方法,dispatch方法根据请求方式不同触发 get/post/put等方法 class APIView(View): def ...
 - js 异步加载
			
document 加载 document.write("<scr" + "ipt src=\"js/jquery.js\"></sc ...