堆排序(Heapsort)是利用堆这种数据结构的排序算法。堆是一个近似完全二叉树的结构。

  堆的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

堆节点的访问

通常堆是通过一维数组来实现的。在起始数组为 0 的情形中:

  • 堆的根节点(即堆积树的最大值)存放在数组位置 1 的地方;

  注意:不使用位置 0,否则左子树永远为 0[2]

  • 父节点i的左子节点在位置 (2*i);
  • 父节点i的右子节点在位置 (2*i+1);
  • 子节点i的父节点在位置 floor(i/2);

堆的操作

在堆的数据结构中,堆中的最大值总是位于根节点。堆中定义以下几种操作:

  • 最大堆调整(Max_Heapify):将堆的末端子结点作调整,使得子结点永远小于父结点
  • 创建最大堆(Build_Max_Heap):将堆所有数据重新排序
  • 堆排序(HeapSort):移除位在第一个数据的根结点,并做最大堆调整的递归运算

数组堆积排序

 1 #include<iostream>
 2 using namespace std;
 3
 4 //筛选法
 5 void sift(int E[],int j,int length)
 6 {
 7     int i=j;
 8     int c = 2*i+1;//数据从0开始
 9
10     while(c < length)
11     {
12         if((c+1<length)&&(E[c]<E[c+1]))//左孩子<右孩子 时,取大的(右孩子)
13             c++;
14         if(E[i]>E[c])
15             break;//此节点数据已经比孩子节点数据大 则停止循环
16         else
17         {
18             int t=E[i];
19             E[i]=E[c];
20             E[c]=t;
21
22             i=c;//继续重复上述操作,直到孩子节点小于此节点或到数的最后一层
23             c = 2*i+1;
24         }
25     }
26 }
27 //堆排序
28 void HeapSort(int E[],int n)//第二个参数是数组长度
29 {
30     //初始化堆
31     for(int i=n/2;i>=0;i--)//i=n/2是从倒数第二行开始
32         sift(E,i,n);
33
34     for(int i=0;i<n;i++)//所有的元素
35     {
36         //数组的0号位置与堆内剩余的数据中最后一个交换位置
37         int t=E[n-i-1];
38         E[n-i-1]=E[0];
39         E[0]=t;
40
41         sift(E,0,n-i-1);//每次都是数组的0号位置
42     }
43 }
44
45 int main()
46 {
47     int E[]={3, 5, 3, 6, 4, 7, 5, 7, 4};
48     cout<<"原始序列:"<<endl;
49     for(int i=0;i<sizeof(E)/sizeof(int);i++)
50         cout<<E[i]<<" ";
51     cout<<endl;
52
53     HeapSort(E,sizeof(E)/sizeof(*E));
54
55     cout<<"堆排序后的序列:"<<endl;
56     for(int i=0;i<sizeof(E)/sizeof(int);i++)
57         cout<<E[i]<<" ";
58     cout<<endl;
59
60     return 0;
61 }

 

 


本文 由 cococo点点 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自:cococo点点 http://www.cnblogs.com/coder2012

时间: 2024-10-29 13:48:45

堆排序(Heapsort)是利用堆这种数据结构的排序算法。堆是一个近似完全二叉树的结构。的相关文章

数据结构之排序算法

    数据结构中的排序算法很经典,在软考中所占据的分数也不少,下面就跟大家细说一下排序算法吧.     算法排序大致分为5类:插入排序,选择排序,交换排序,归并排序,基数排序.  [插入排序]     插入排序有直接插入排序和希尔排序算法.     直接插入排序,输入一个元素,检查数组列表中的每个元素,将其插入到一个已经排好序的数列中的适当位置,使数列依然有序,当最后一个元素放入合适位置时,该数组排序完毕.     每次插入都是从第0个元素开始比较,若原数列为递增数列,则排在小于第i个元素的前

排序算法系列之堆排序

   堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法.堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点. 1 堆排序定义     n个关键字序列Kl,K2,-,Kn称为堆,当且仅当该序列满足如下性质(简称为堆性质):    (1) ki≤K2i且ki≤K2i+1 或(2)Ki≥K2i且ki≥K2i+1(1≤i≤  )    若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完

常见的五类排序算法图解和实现(选择类:简单选择排序,锦标赛排序,树形选择排序,堆排序)

选择类的排序算法 简单选择排序算法 采用最简单的选择方式,从头到尾扫描待排序列,找一个最小的记录(递增排序),和第一个记录交换位置,再从剩下的记录中继续反复这个过程,直到全部有序. 具体过程: 首先通过 n –1 次关键字比较,从 n 个记录中找出关键字最小的记录,将它与第一个记录交换. 再通过 n –2 次比较,从剩余的 n –1 个记录中找出关键字次小的记录,将它与第二个记录交换. 重复上述操作,共进行 n –1 趟排序后,排序结束. 如图   过程图解 令 k=i:j = i + 1: 目

常用内部排序算法之三:堆排序

前言 堆排序是以堆为原型的排序.堆首先是一棵二叉树,具有以下两个性质:每个节点的值大于或者等于其左右孩子结点的值,称为大顶堆:或者每个节点的值都小于或者等于其左右孩子结点的值,称为小顶堆.从这个定义中可以发现,堆得根节点要么是最大值要么是最小值.实现堆排序的基本思想是:将待排序的序列构造成一个大顶堆或者小顶堆.此时整个堆满足根节点是最大值或者最小值.将根节点移走,并与堆数组的最后一个值进行交换,这样的话最后一个值就是最大值或者最小值了.然后将剩余n-1(假设原来总共有n个元素)未排序的序列重新构

java数据结构与算法之奇偶排序算法完整示例_java

本文实例讲述了java数据结构与算法之奇偶排序算法.分享给大家供大家参考,具体如下: 算法思想: 基本思路是奇数列排一趟序,偶数列排一趟序,再奇数排,再偶数排,直到全部有序 举例吧, 待排数组[6 2 4 1 5 9] 第一次比较奇数列,奇数列与它的邻居偶数列比较,如6和2比,4和1比,5和9比 [6 2 4 1 5 9] 交换后变成 [2 6 1 4 5 9]  第二次比较偶数列,即6和1比,5和5比 [2 6 1 4 5 9] 交换后变成 [2 1 6 4 5 9]  第三趟又是奇数列,选择

数据结构 之 二叉堆(Heap)

注:本节主要讨论最大堆(最小堆同理). 一.堆的概念     堆,又称二叉堆.同二叉查找树一样,堆也有两个性质,即结构性和堆序性.     1.结构性质:     堆是一棵被完全填满的二叉树,有可能的例外是在底层,底层上的元素从左到右填入.这样的树称为完全二叉树(complete binary tree).下图就是这样一个例子.         对于完全二叉树,有这样一些性质:     (1).一棵高h的完全二叉树,其包含2^h ~ (2^(h+1) - 1)个节点.也就是说,完全二叉树的高是[

Java实现堆排序(Heapsort)实例代码_java

复制代码 代码如下: import java.util.Arrays; public class HeapSort {     public static void heapSort(DataWraper[] data){        System.out.println("开始排序");        int arrayLength=data.length;        //循环建堆        for(int i=0;i<arrayLength-1;i++){     

数据结构——排序算法总结

  排序(Sorting)就是将一组对象按照规定的次序重新排列的过程,排序往往是为检索而服务的,它是数据处理中一种很重要也很常用的运算.例如我们日常学习中的查字典或者书籍的目录,这些都事先为我们排好序,因此大大降低了我们的检索时间,提高工作效率.   排序可分为两大类:   内部排序(Internal Sorting):待排序的记录全部存放在计算机内存中进行的排序过程:   外部排序(External Sorting):待排序的记录数量很大,内存不能存储全部记录,需要对外存进行访问的排序过程.

Java排序算法&amp;amp;nbsp;堆排序

1991年计算机先驱奖获得者.斯坦福大学计算机科学系教授罗伯特·弗洛伊德(Robert W.Floyd)和威廉姆斯(J.Williams)在1964年共同发明了著名的堆排序算法( Heap Sort ).本文主要介绍堆排序用Java来实现. AD: 堆积排序(Heapsort)是指利用堆积树(堆)这种资料结构所设计的一种排序算法,可以利用数组的特点快速定位指定索引的元素.堆排序是不稳定的排序方法,辅助空间为O(1), 最坏时间复杂度为O(nlog2n) ,堆排序的堆序的平均性能较接近于最坏性能.