排序——堆排序

一、什么是堆

堆是具有如下性质的完全二叉树。每个节点大于或者等于其左右孩子结点的值,称为大顶堆。

或者每个结点的值都小于或者等于左右孩子结点的值,称为小顶堆。

二、如果通过堆排序

由堆的定义可以知道,在堆中,顶点最大(或者最小)。我们就可以把堆顶拿出来,再把剩下的再次组成堆。然后再拿出堆顶。

这样就实现排序啦。

还需要解决两个问题:

(1)如何把一凌乱的数据组成堆

(2)把顶点拿出来之后,如何重建堆。

三、如何由一个无序的序列建成一个堆

找到第(n/2)个数。为什么要找到这个数?因为由于慢二叉树的性质可知,此数都是有孩子的结点。

也就是通过这些数,来包含了所有的结点。

for(i=(n/2);i>=1;i--)

{

和自己的左右孩子的最大值比较,如果比它大,则不变动。

如果小,则交换。

}

四、如何在输出堆顶元素后,调整剩余元素成为一个新的堆

(1)将最后一个元素换到顶部。

(2)然后依次和自己的孩子比较,将大的孩子放到堆顶。直到成为叶子节点。

五、时间复杂度为o(n*log(n))

时间: 2024-09-03 10:50:07

排序——堆排序的相关文章

插入排序 | 冒泡排序 | 希尔排序 | 堆排序 | 快速排序 | 选择排序 | 归并排序

以下是最近学习各种算法的代码实现: #include <stdlib.h> #include <stdio.h> #include <time.h> #include <limits.h> typedef int EleType; typedef int (*CompFunc)(void *,void *); int IntComp(void * a,void *b) { if(*(int *)a > *(int *)b) return 1; if(*

排序 选择排序&amp;&amp;堆排序

选择排序&&堆排序 1.选择排序: 介绍:选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕. 步骤:假设数组array长度为N即有数组内有N个数据未排序数据 1.第一趟遍历将这N个数据中最小的数据和array[0]交换. 2.第二趟则遍历N-1个数据,将这N-1个数据中最小的和arra

C# 插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序

以下列出了数据结构与算法的八种基本排序:插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序,然后是測试的样例.代码位置:http://download.csdn.net/detail/luozuolincool/8040027 排序类: public class Sortings { //插入排序 public void insertSort(int[] array) { int temp = 0; int index = 0; for (int i = 0; i <

排序——堆排序算法

堆排序利用的完全二叉树这种数据结构所设计的一种算法,不过也是选择排序的一种. 堆实质上是满足如下性质的完全二叉树:k[i]<=k[2*i]&&k[i]<=k[2*i+1]或者k[i]>=k[2*i]&&k[i]>=k[2*i+1], 树中任一非叶子结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字. 堆分大顶堆和小顶堆:k[i]<=k[2*i]&&k[i]<=k[2*i+1]是小顶堆,k[i]>=k[2

八大排序算法之四选择排序—堆排序(Heap Sort)

堆排序是一种树形选择排序,是对直接选择排序的有效改进. 基本思想: 堆的定义如下:具有n个元素的序列(k1,k2,...,kn),当且仅当满足 时称之为堆.由堆的定义可以看出,堆顶元素(即第一个元素)必为最小项(小顶堆). 若以一维数组存储一个堆,则堆对应一棵完全二叉树,且所有非叶结点的值均不大于(或不小于)其子女的值,根结点(堆顶元素)的值是最小(或最大)的.如: (a)大顶堆序列:(96, 83,27,38,11,09) (b)  小顶堆序列:(12,36,24,85,47,30,53,91

希尔排序 堆排序 归并排序

希尔排序(by Donald Shell): 假定给了一个需要排序的数组并且 按照5-间隔的方式进行排序 附图如下 我们  慢慢的按照 越来越小的间隔开始去排序      (最后只能是间隔为1). 堆排序: 先回顾一下插入排序 void Selection_Sort ( ElementType A[], int N ) { for ( i = 0; i < N; i ++ ) { MinPosition = ScanForMin( A, i, N–1 ); //对应的也是一个for循环 没有最好

数据结构排序-堆排序

堆排序就是利用了最大堆(或最小堆)堆顶记录的关键字最大(或最小)这一特征,使得在当前无序区中选取最大(或最小)关键字变得简单.以最大堆为例,它的基本思想就是: 先将初始文件R[1..n]建成一个最大堆,此堆为初始的无序区: 再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换,由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key: 由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆.然后再次

选择排序---堆排序算法(Javascript版)

堆排序分为两个过程: 1.建堆. 堆实质上是完全二叉树,必须满足:树中任一非叶子结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字. 堆分为:大根堆和小根堆,升序排序采用大根堆,降序排序采用小根堆. 如果是大根堆,则通过调整函数将值最大的节点调整至堆根. 2.将堆根保存于尾部,并对剩余序列调用调整函数,调整完成后,再将最大跟保存于尾部-1(-1,-2,...,-i),再对剩余序列进行调整,反复进行该过程,直至排序完成. 以下代码在nodejs中执行通过 //调整函数function

选择排序—堆排序(Heap Sort) 没看明白,不解释

堆排序是一种树形选择排序,是对直接选择排序的有效改进. 基本思想: 堆的定义如下:具有n个元素的序列(k1,k2,...,kn),当且仅当满足 时称之为堆.由堆的定义可以看出,堆顶元素(即第一个元素)必为最小项(小顶堆). 若以一维数组存储一个堆,则堆对应一棵完全二叉树,且所有非叶结点的值均不大于(或不小于)其子女的值,根结点(堆顶元素)的值是最小(或最大)的.如: (a)大顶堆序列:(96, 83,27,38,11,09) (b)  小顶堆序列:(12,36,24,85,47,30,53,91

排序算法7--选择排序--堆排序

堆排序 1.堆排序是一种树形选择排序,在排序过程中,将待排序的记录r[1..n]看成是一棵完全二叉树的顺序存储结构,利用完全二叉树的双亲结点和孩子结点之间的内在关系,在当前无序的序列中选择关键字最大(或者最小的)记录   1.1.先将无序队列,列成二叉树的的样子 1.2.建初堆.从n/2向上取整处开始调整,当前节点数字一定要大于(小于)左右两孩子,n/2--,一直向上若最后排序结果是升序就调整成大顶堆,若是降序就调整成小顶堆 1.3.开始排序,将堆顶元素和最后一个元素互换位置,换下来的即可以依次