`
cshopping829
  • 浏览: 3537 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

最大堆 排序

阅读更多
卸载最前面,下面的所有讨论都是基于二叉堆

一:什么是堆:
堆是一个数组结构,可以看着为一颗完全二叉树,把这颗完全二叉树按层从上到下,每层从左至右编序号,每个序号所对应的元素即为数组中该序号的元素;该树出最后一层以外每一层都排满,最后一层从左至右,先左孩子再右孩子排列,如果有父节点没有排满孩子(无孩子或无右孩子),只可能是右边的父节点未排满孩子。
因此该结构有如下结构:
如果节点i,则它的左孩子为2*I,右孩子为2*i+1;原因:节点i所对应的深度为h=log2(i);所以左孩子为2^log2(i)+2*(i-i/2)=2i;
二:堆排序过程
先构建堆—》把最后一个节点和第一个节点互换—》调整堆—》第一个节点与倒数第二个节点互换,依次进行:
三:代码
#include <stdio.h>
#include <math.h>
/*
假设i的左孩子与右孩子已经是一个最大堆,现在要把i放入到堆中,如果i比左右孩子都大直接放入,如果i比左孩子或者右孩子小,则与该孩子互换,交换以后再调整该孩子所在子树,一直调整到合适位置为止
*/
void heapify(int *pArray, int i, int iHeapSize)
{
int iLargest = i;
int iLeft = 2*i, iRight = 2*i+1;
int tmp;
if(iLeft < iHeapSize && *(pArray+i) < *(pArray+iLeft))
{
if(*(pArray+i) < *(pArray+iLeft))
{
iLargest = iLeft;
}
else
{
iLargest = i;
}
}
if(iRight < iHeapSize && *(pArray + iRight) > *(pArray + iLargest))
{
iLargest = iRight;
}

if(i != iLargest)
{
tmp =  *(pArray + iLargest);
*(pArray + iLargest) = *(pArray+i);
*(pArray+i) = tmp;
  heapify(pArray, iLargest, iHeapSize);
}
else
{
return;
}
}
/*
因为n/2+1~n都为叶子节点;
最后一层深度h = log2(n);倒数第二层最后一个节点为:2^(log2(n)-1)=n/2
*/
void buid_heap(int *pArray, int size)
{
for(int i = size/2-1; i >= 0;  i--)
{
heapify(pArray, i, size);
}
}

void heap_sort(int *pArray, int size)
{
int tmp;
int i;
buid_heap(pArray, size);
for(i = 0; i < size; ++i)
{
tmp = *(pArray);
*(pArray) = *(pArray + (size-1-i));
*(pArray + (size-1-i)) = tmp;
heapify(pArray, 0, size - i-1);
}
}
分享到:
评论

相关推荐

    Java 最大堆排序

    Java 写得最大堆排序代码,给大家参考下,自己刚写的。

    最大堆排序算法源代码

    最大堆排序是一种基于比较的排序算法,其主要思想是利用数据结构中的最大堆特性来实现元素的排序。在最大堆中,每个父节点的值都大于或等于其子节点的值,形成一个倒置的完全二叉树。下面将详细解释最大堆排序的原理...

    最大堆MaxHeap排序 C++代码

    最大堆排序(MaxHeap Sort)是一种基于比较的排序算法,它利用了数据结构中的最大堆特性来实现排序。最大堆是一种特殊的二叉堆,每个父节点的值都大于或等于其子节点的值,通常以数组的形式存储。下面将详细介绍最大...

    最大堆实现排序(从大到小输出)

    在深入了解最大堆排序之前,我们首先需要了解几个基本的概念。 **堆**:堆是一种特殊的完全二叉树形式的数据结构,在这种结构中,对于每一个节点,其值都大于等于(最大堆)或小于等于(最小堆)它的子节点的值。...

    堆排序(R)

    在排序算法中,堆排序是一个快速排序方法,下面是我用R语言编写的最大堆排序

    c#写的最大堆排序算法

    就是打开连接靠近看见是看了就刻录机会计科就刻录机

    堆排序算法源代码

    堆排序是一种基于比较的排序算法,它通过构造一个大顶堆或小顶堆来实现排序。在本场景中,我们关注的是堆排序的源代码,它适用于openSUSE 11.4操作系统,并且是使用GCC version 4.5.1编译器编译的。在这个名为"sort...

    用C++写的堆排序(最大堆和最小堆)

    以下是一个使用STL实现的最大堆排序示例: ```cpp #include #include void heapSort(std::vector&lt;int&gt;& arr) { std::make_heap(arr.begin(), arr.end()); // 建立最大堆 for (int i = arr.size() - 1; i &gt; 0; ...

    C++语言的算法实现包括插入排序冒泡排序堆排序快速排序

    本文将深入探讨四种在C++中实现的常见排序算法:插入排序、冒泡排序、堆排序和快速排序。这些算法各有特点,适用于不同的场景,理解并掌握它们对于提升编程能力至关重要。 1. **插入排序**: 插入排序是一种简单的...

    算法设计实验报告堆排序代码

    【堆排序算法详解】 堆排序是一种高效的比较排序算法,其主要思想是利用堆这种数据结构进行数据的排序。堆是一个近似完全二叉树的结构,同时满足堆的性质:即父节点的键值总是大于或等于(在最大堆中)或小于或等于...

    堆排序的Java实现最大堆方法HeapSort

    在堆排序算法中,我们使用了一种叫做最大堆的堆结构。最大堆是一个满足所有父节点的键值都大于或等于其子节点键值的二叉树。 在Java中实现堆排序时,我们需要完成两个关键步骤:构建最大堆和维护最大堆性质的...

    堆排序的c++实现代码

    堆排序是一种基于比较的排序算法,它通过构造一个大顶堆或小顶堆来实现排序。在大顶堆中,父节点的值总是大于或等于其子节点;而在小顶堆中,父节点的值总是小于或等于其子节点。在C++中,我们可以利用STL中的`...

    堆排序 里面有关于堆排序的练习台

    1. 设计堆排序的算法,这包括建立最大堆、交换堆顶元素与末尾元素以及调整堆的过程。 2. 应用堆排序对无序数据进行排序,并分析其性能,比如比较平均和最坏情况下的时间效率。 数据输入与输出: 输入数据由多组整数...

    学生成绩管理中实现堆排序

    在这个名为“学生成绩管理中实现堆排序”的项目中,我们看到一个C++编写的学生成绩管理系统,它使用了堆排序方法来管理并排序学生的成绩。 首先,让我们详细了解一下堆。堆通常是一个完全二叉树,可以分为最大堆和...

    堆排序算法实现堆排序

    堆排序是一种基于比较的排序算法,它通过构造一个近似完全二叉树的堆结构来实现数据的排序。在此,我们将深入探讨堆排序的基本概念、原理以及如何通过编程实现。 一、堆排序的概念 堆是一个近似完全二叉树的结构,...

    希尔排序,冒泡排序,堆排序等各种排序算法

    堆排序先将数组构建成一个大顶堆,然后将堆顶元素(最大值)与末尾元素交换,再调整剩下的元素为堆,如此反复进行。堆排序的平均和最坏时间复杂度均为O(n log n)。 这些排序算法各有优缺点,适用于不同的场景。例如...

    堆排序(最大堆修改版)【算法导论】

    上个资源的有效排序下标是由1开始的,0只做了填充作用,这次则由下标0为根节点: for(int i = length; i &gt;= 1;) //最后一个肯定是最小的 { temp = A[i]; //交换堆的第一个元素和堆的最后一个元素 A[i] = A[0]; ...

    直接插入排序 冒泡排序 快速排序 直接选择排序 堆排序 二路归并排序 C#源代码

    直接插入排序、冒泡排序、快速排序、直接选择排序、堆排序和二路归并排序是计算机科学中经典的排序算法,它们在数据处理和算法学习中占有重要地位。这些排序算法各有特点,适用场景不同,下面将逐一详细介绍,并结合...

    7大排序算法实现程序(快速排序,冒泡排序,选择排序,归并排序,插入排序,希尔排序,堆排序)

    本资源提供了七大经典排序算法的实现程序,包括快速排序、冒泡排序、选择排序、归并排序、插入排序、希尔排序和堆排序。下面将逐一详细介绍这些排序算法及其原理。 1. 快速排序:由C.A.R. Hoare提出,是一种采用...

    数据结构堆排序

    堆是一种特殊的树形数据结构,每个节点都有一个值,并且满足以下性质:对于任何非叶节点,其值都大于或等于(最大堆)或小于或等于(最小堆)它的子节点的值。在最大堆中,根节点是所有节点中最大的;在最小堆中,根...

Global site tag (gtag.js) - Google Analytics