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

代码:

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 last element (n/2) which has the child;
    notice that the elements we should percolate are always all the elements.*/

/*before the beginning of the formal heapsort, the array has been adjusted to a heap*/

for (int i = n - 1; i >= 1; i++){
        Tmp = a[i];
        a[i] = a[0];
        a[0] = Tmp;
        /*This step aim at remove the minimum element out of the heap,it‘s important to
        understand the following progress of percolating the heap would not affect this
        element*/
        PercDown(a, 0, i);
        /*We just percolate down the first elements, which would not affect those elements which
        have been sorted*/
    }
}
//下滤算法,从i节点开始调整,n为节点总数,从0开始计算,i节点的子节点为2*i+1,2*i+2
void PercDown(int a[], int i, int n)
{
    int child, temp;

temp = a[i];/*remember the element which are expected to adjust*/
    child = 2 * i + 1;
    while (child < n){
        if (child + 1 < n && a[child + 1] < a[child])
            child++;
        /*find the smaller child to ensure all two childs are all larger than the parent*/
        if (a[child] >= temp)  break;
        /*if so, the position would be identified.*/
        else{
            a[i] = a[child];//make the smaller child become the parent node
            i = child;//the child position become the new parent position
            child = 2 * i + 1;// the new left child position
        }
    }

a[i] = temp;
    /*find the appropriate position*/
}

时间: 2024-11-18 03:08:27

数据结构与算法——堆排序的相关文章

数据结构和算法-堆排序

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 =

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. 数组.单链表和双链表