数据结构和算法-堆排序

1 维护最大堆性质的过程(MAX-HEAPIFY)

输入数组A和一个下标i。假设以LEFT(i)和RIGHT(i)为根节点二叉树都是最大堆,但是A[i]可能小于左右孩子节点。这时需要通过该过程使得A[i]在最大堆中“逐级下降”,从而使得以下标i为根节点二叉树为最大堆。

伪代码 :

MAX-HEAPIFY(A , i)

L = LEFT(i) = 2i ;

R = RIGHT(i) = 2i+1;

if(L <= A.heap-size and A[L] > A[i]) {

largest = L;

} else {

largest = i;

}

if(R <= A.heap-size and A[R] > A[largest]) {

largest = R;

}

if( largest != i )

max = A[largest];

A[largest]= A[i];

A[i]  = max;

MAX-HEAPIFY(A , largest)

2 构建一个最大堆过程(BUILD-MAX-HEAP)

利用过程(MAX-HEAPIFY)把一个大小为n = A.length 的数组 A[1,...,n] 转化为最大堆。根据树的结构特点,子数组A(↓(n/2),...,n)中的元素都是树的叶节点 。每个叶节点都可以看成只包含一个元素的堆。过程BUILD-MAX-HEAP对树中非叶节点都调用一次过程(MAX-HEAPIFY)

BUILD-MAX-HEAP(A)

A.heap-size = A.length;

for(i = ↓A.length/2; i >= 1; i--) {

MAX-HEAPIFY(A , i) ;

}

3 堆排序过程

利用BUILD-MAX-HEAP将输入数组A[1,...,n]建成最大堆。数组最大元素A[1],交换A[1]与A[n],再通过A.heap-size-1来去掉节点n,再调用MAX-HEAPIFY来维护最大堆。不断重复该过程,直到堆的大小到2

伪代码:

HEAPSORT(A)

BUILD-MAX-HEAP(A)

for(i = A.lenght; i >=2; i++) {

max = A[1];

A[1] = A[i];

A[i] = max;

A.heap-size =  A.heap-size -1;

MAX-HEAPIFY(A , 1);

}

堆排序的时间复杂度Θ(nlgn)

原文地址:https://www.cnblogs.com/zhang-feng/p/12010030.html

时间: 2024-10-13 19:37:25

数据结构和算法-堆排序的相关文章

数据结构与算法——堆排序

代码: void HeapSort(int a[], int n){    int Tmp;    for (int i = n / 2; i >= 0; i--)        PercDown(a, i, n);    /*build a heap; we should know that intinially we put all of the  elements randomly, then    we begin to percolate down the heap from the

java数据结构和算法------堆排序

1 package iYou.neugle.sort; 2 3 public class Heap_sort { 4 public static void HeapSort(double[] array) { 5 for (int i = (int) Math.floor(array.length / 2); i > 0; i--) { 6 HeapBuild(array, i, array.length); 7 } 8 9 for (int i = array.length - 1; i >

【算法与数据结构】图说堆排序

1.堆   一棵完全二叉树 大顶堆:所有非叶子节点元素均不小于其左右子树根节点的值 小顶堆:所有非叶子节点元素均不大于其左右子树根节点的值 2. 初始化堆 ①一组无序元素R[0, 1, ..., n - 1], 先按照顺序将该组无序元素构造为一棵完全二叉树 ②从该二叉树的第一个非叶子结点开始调整,然后调整前一个结点(一定是非叶子结点),依次直到调整完根节点 ③上一步一遍完成后,再来一遍,直到该完全二叉树符合一个堆的定义为止 测试数据:R[] = {16, 7, 3, 20, 17, 8}, 本组

【数据结构和算法16】堆排序

堆排序,顾名思义就是利用堆这个数据结构对数据项进行排序.前面提到过.堆数据结构中.节点大于或等于自己的子节点.那么我们能够将待排序的数据项依次加入到堆中,然后再依次取出根节点就可以.从堆中取出的数据项是从大到小排列的.由于根节点永远是最大的.而堆中永远是取根节点.假设对堆这样的数据结构不太了解的话,能够先看这篇博文:数据结构和算法之 堆.这里不再赘述. 以下我们来看看堆排序的实现(假设程序有不清楚的地方.也能够參考上面那篇博文). public class HeapSort { private

【数据结构与算法】堆排序

堆排序的时间复杂度是O(nlogn),下面上代码 public class HeapSort { public void adjustHeap(int[] in, int index, int length) { int leftcIndex = index * 2 + 1; int rightcIndex = index * 2 + 2; int bigest = index; while (leftcIndex < length || rightcIndex < length) { if

JavaScript 数据结构与算法之美 - 归并排序、快速排序、希尔排序、堆排序

1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习. 之所以把归并排序.快速排序.希尔排序.堆排序放在一起比较,是因为它们的平均时间复杂度都为 O(nlogn). 请大家带着问题:快排和归并用的都是分治思想,递推公式和递归代码也非常相似,那它们的区别在哪里呢 ? 来阅读下文. 2. 归并排序(Merge Sort) 思想 排序一个数

[算法学习笔记]排序算法——堆排序

堆排序 堆排序(heapsort)也是一种相对高效的排序方法,堆排序的时间复杂度为O(n lgn),同时堆排序使用了一种名为堆的数据结构进行管理. 二叉堆 二叉堆是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树.二叉堆满足堆特性:父节点的键值总是保持固定的序关系于任何一个子节点的键值,且每个节点的左子树和右子树都是一个二叉堆. 如上图显示,(a)是一个二叉堆(最大堆), (b)是这个二叉堆在数组中的存储形式. 通过给个一个节点的下标i, 很容易计算出其父节点,左右子节点的的下标,为了方便,

面试常考数据结构与算法

数据结构部分: 1.数组和链表的区别.(很简单,但是很常考,记得要回答全面) C++语言中可以用数组处理一组数据类型相同的数据,但不允许动态定义数组的大小,即在使用数组之前必须确定数组的大小.而在实际应用中,用户使用数组之前无法确定数组的大小,只能够将数组定义成足够大小,这样数组的空间可能不被使用,从而造成内存空间的浪费.链表是一种常见的数据组织形式,他采用动态分配内存的形式实现.需要时可以用new分配内存空间,不需要时用delete将已分配的空间释放,不会造成内存空间的浪费. 从逻辑结构上来看

数据结构与算法系列 目录

最近抽空整理了"数据结构和算法"的相关文章.在整理过程中,对于每种数据结构和算法分别给出"C"."C++"和"Java"这三种语言的实现:实现语言虽不同,但原理如出一辙.因此,读者在了解和学习的过程中,择其一即可! 下面是整理数据数据和算法的目录表,对于每一种按照C/C++/Java进行了划分,方便查阅.若文章有错误或纰漏,请不吝指正.谢谢! 数据结构和算法目录表   C C++ Java 线性结构 1. 数组.单链表和双链表