堆排序
时间:2022-04-26
本文章向大家介绍堆排序,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
堆排序是对简单选择排序算法的一种改进,在每次选择最小记录的同时,根据比较结果对其他记录做出相应的调整。
堆是具有下列性质的完全二叉树:每个节点的值都大于(小于)或者等于其左右孩子节点的值,为大顶堆(小于)。
堆排序的基本思想是:从最后一个含有叶子节点的节点开始将待排序列构造成一个堆,然后将堆顶元素与末尾元素交换,然后不管末尾元素,将剩余的元素重新形成一个堆,如此反复,直到有序。
注意:由于堆是一种树形结构,所以被排序的序列要从1开始编号。
// 堆排序.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
using namespace std;
//将L数组中s到len的数据建立成为大顶堆
void HeapAdjust(int *L,int s,int len)
{
int temp;
temp=L[s];
for(int j=2*s;j<=len;j=j*2)
{
if(j<len&&L[j]<=L[j+1])//找到孩子节点中较大的那个
{
j++;
}
if(temp<L[j])//如果节点比孩子节点中较大的那个小,将此节点替换为较大的孩子节点
{
L[s]=L[j];
s=j;
}
}
L[s]=temp;
}
void swap(int *L,int i,int j)
{
int temp=L[i];
L[i]=L[j];
L[j]=temp;
}
//输入数组名和数组长度,进行堆排序
void heapsort(int *L,int len)
{
//从最后一个含有叶子节点的节点开始构造堆(参见二叉树性质5)
for(int i=len/2;i>0;i--)
{
HeapAdjust(L,i,len);
}
//每一次交换堆顶和堆尾元素,然后重新构造堆
for(int i=len;i>1;i--)
{
swap(L,1,i);
HeapAdjust(L,1,i-1);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int num[10]={0,2,5,4,7,5,4,8,41,86};
//注意这里由于堆排序利用的是二叉树的第五条性质,所以数组下标要从1开始,num中0不在排序的序列之中
heapsort(num,9);
for(int i=1;i<10;i++)
{
cout<<num[i]<<' ';
}
return 0;
}
更加图文并茂的推荐一篇别人的博文:http://www.cnblogs.com/dolphin0520/archive/2011/10/06/2199741.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python格式化输出
- 多线程 - 生产者消费者模式
- TCP的三次握手和四次挥手
- Springboot异常处理
- Excel实战技巧84: 让形状生动起来
- 利用Python进行组合数计算
- Docker下解决mysql出现"the table is full"的问题
- unity3d 5.0中Renderer后面没有了material
- 在windows下检查应用程序是否为兼容模式启动及使用Qt输出系统信息
- Qt5.5.1版本中QString().arg()和qss在处理路径及文件名需要注意的地方
- Typecho将Gravatar头像改为QQ头像
- python socket 简单示例
- 深入了解C++虚函数
- Mathematica 在高考数学与高等数学等学习中的简单应用与思考
- 数据结构之【实现数组】