堆排序C++实现
/*
* heapsort.cpp
*
* Created on: 2016年3月30日
* Author: Lv_Lang
*/
//堆排序
#include <iostream>
using namespace std;
/*堆排序算法解析:
核心思想在于建立最大堆(或最小堆),
因为最大堆满足一个性质:所有的父节点都要比它的左右节点均要大,
于是据此可以每次将最大的(根节点)抽取出来(实际上是放最后面),
每次都抽取剩余部分的最大值,那最终得到的序列就是有序的。
所以堆排序其实算是一种高级版的选择排序。
建立最大堆的方法:首先从底层的父节点开始,把它的子树整成最大堆,
然后往上整成最大堆,注意这里要从下往上。
最后堆排序就是先建立一个最大堆,然后把根节点元素也就是最大的元素
跟最后面的元素交换,这样一来,树就未必满足最大堆了,所以要重新
进行堆的调整(不包括已经被抽取的最大元素)。这样下来,每次都抽取
出子序列的最大元素,最终的序列就从小到大排好序了。*/
void swap(int a[],int i,int j)
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
void HeapAdjust(int *a,int i,int size)
{
int left = 2*i;//左孩子节点
int right = 2*i + 1;//右孩子节点
int max = i;//暂存最大元素下标
if(left <= size && a[left] > a[max])
//这里不直接交换是因为如果交换则要进行递归,
//所以连同右边的也判断了再做可能的交换和做可能的递归,
//递归的原因则是因为你把人的老爸交换了,
//那人家的儿子可能就比继父要大了。
//swap(a,left,i);
max = left;
if(right <= size && a[right] > a[max])
max = right;
if(max != i)//表明当前的父节点并不是最大的
{
swap(a,i,max);
HeapAdjust(a,max,size);//有交换就要递归把子树也整成最大堆
}
}
void BuildHeap(int a[],int size)
{
for(int i = size / 2;i >= 1;i--)//非叶节点最大下标为/2
{
HeapAdjust(a,i,size);
}
}
//堆排序对要排序的序列有个要求就是下标是从1开始到size的,而并非常用的0~size-1
void HeapSort(int a[],int size)
{
BuildHeap(a,size);//先建立初始的最大堆
for(int i = size;i >= 2;i--)
{
swap(a,1,i);//把最大的元素放到最后面
size--;//不再包括最大的元素
//这里之所以直接从根节点开始维护堆是因为除了根节点外的其他子树都是最大堆了。
//而上面第一次建立最大堆时不能保证父节点已经是最大的了,
//所以上面的需要先从底层的非叶节点层开始维护/调整堆。
HeapAdjust(a,1,size);
}
//至此数组就已经从小到大排好序了,
//如果要从大到小输出,则倒着输出就行了;
//而如果要将序列从大到小排序,则应建立最小堆。
}
void print(int a[],int size)
{
for(int i=1;i < size;i++)
cout<<a[i]<<" ";
cout<<a[size]<<endl;
}
int main()
{
int a[7] = {0,4,6,1,5,3,2};
cout<<"排序之前的序列为:"<<endl;
print(a,6);
HeapSort(a,6);
cout<<"排序之后的序列为:"<<endl;
print(a,6);
return 0;
}
关于堆排序算法,网上有更好更详细的解析,这里放一个我觉得挺好的解析博客,因为它有图:
堆排序C++实现的更多相关文章
- 算法与数据结构(十四) 堆排序 (Swift 3.0版)
上篇博客主要讲了冒泡排序.插入排序.希尔排序以及选择排序.本篇博客就来讲一下堆排序(Heap Sort).看到堆排序这个名字我们就应该知道这种排序方式的特点,就是利用堆来讲我们的序列进行排序.&quo ...
- [数据结构]——堆(Heap)、堆排序和TopK
堆(heap),是一种特殊的数据结构.之所以特殊,因为堆的形象化是一个棵完全二叉树,并且满足任意节点始终不大于(或者不小于)左右子节点(有别于二叉搜索树Binary Search Tree).其中,前 ...
- 堆排序与优先队列——算法导论(7)
1. 预备知识 (1) 基本概念 如图,(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树.树中的每一个结点对应数组中的一个元素.除了最底层外,该树是完全充满的,而且从左向右填充.堆的数组 ...
- 数据结构:堆排序 (python版) 小顶堆实现从大到小排序 | 大顶堆实现从小到大排序
#!/usr/bin/env python # -*- coding:utf-8 -*- ''' Author: Minion-Xu 小堆序实现从大到小排序,大堆序实现从小到大排序 重点的地方:小堆序 ...
- 堆排序(python实现)
堆排序是利用最大最或最小堆,废话不多说: 先给出几个概念: 二叉树:二叉树是每个节点最多有两个子树的树结构.通常子树被称作“左子树”(left subtree)和“右子树” 完全二叉树:除最后一层外, ...
- 堆排序分析及php实现
堆排序:是一种特殊形式的选择排序,他是简单选择排序的一种改进. 什么是堆? 具有n个元素的序列:{k1,k2,ki,…,kn} (ki <= k2i,ki <= k2i+1) 或者 (ki ...
- 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析之后续补充说明(有图有真相)
如果你觉得我的有些话有点唐突,你不理解可以想看看前一篇<C++之冒泡排序.希尔排序.快速排序.插入排序.堆排序.基数排序性能对比分析>. 这几天闲着没事就写了一篇<C++之冒泡排序. ...
- [Unity][Heap sort]用Unity动态演示堆排序的过程(How Heap Sort Works)
[Unity][Heap sort]用Unity动态演示堆排序的过程 How Heap Sort Works 最近做了一个用Unity3D动态演示堆排序过程的程序. I've made this ap ...
- PHP实现堆排序
经验 工作了,面试我工作这家公司时被技术面打击得不行,因为自己的数据结构等基础学得实在太差,虽然原来是想做设计师的说...不过看在PHP写得还凑合的份上能来实习了,但还是决心恶补一下基础. 其实自己之 ...
- 堆排序 Heapsort
Prime + Heap 简直神了 时间优化好多,顺便就把Heapsort给撸了一发 具体看图 Heapsort利用完全二叉树+大(小)顶锥的结构每次将锥定元素和锥最末尾的元素交换 同时大(小)顶锥元 ...
随机推荐
- HTML5离线缓存
参考文档:http://www.w3cschool.cc/html/html5-app-cache.html HTML5 应用程序缓存 又称离线缓存 ,即使断线了,刷新后也还是缓存了原来的页面,不会4 ...
- MySQL数据库常用命令
1.连接mysql数据库:mysql -u用户名 -p密码; 2.创建数据库:create database 数据库名称; 3.删除数据库:drop database 数据库名称; 4.使用数据库:u ...
- 图表,列表在同一DIV里切换显示()
JS: function changeTable(){ $(".countTable").slideDown(); $(".countChart").css(& ...
- javaweb project create
软件分享 myeclipse 10 链接:http://pan.baidu.com/s/1i3tUFpb 密码:qnyo 新建一个web project 找到web.xml 修改这里的index.ph ...
- Sort Colors [LeetCode]
Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...
- Android开发--Adapter的应用
1.简介 Adapter的作用是为GridView,ListView等界面控件与数据之间搭建桥梁,每当列表里的每一项显示到页面时,都会调用到Adapter的getView方法 返回一个View.在An ...
- window.location.href无法跳转的解决办法
-------------------接收别人做的SSO单点登录项目,无源码,只是点击登出按钮一直不跳转. 原因是: <a href="javascript:;" oncli ...
- Linux用sendmail发信失败,提示Connection refused by [127.0.0.1]
现象: Linux用sendmail发信失败,提示Connection refused by [127.0.0.1] 29 14:10:44 iZ257p7xxilZ sendmail[3395]: ...
- Anjs分词器以及关键词抓取使用的方法
首先介绍一下这个网址非常有用本文所有的关于Anjs起源来自这里请先查看一下 https://github.com/NLPchina/ansj_seg 在本次测试使用的是 import java ...
- [css3]叉叉旋转效果
.close_frame{display:inline-block;height:14px;width:14px;background:url("../images/closeiframe. ...