`
zhangbaoming815
  • 浏览: 149580 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

HeapSort

阅读更多

public class HeapSort {  
	
	public static void main(String[] args) {
		Integer[] datas = {5,1,56,4,9,7,23,108,34,24,12};
		sort(datas);
	}
	  
    public static void sort(Integer[] datas) {  
        // 构建最大堆  
        buildMaxHeap(datas);  
        // 循环,每次把根节点和最后一个节点调换位置  
        for (int i = datas.length; i > 1; i--) {  
            Integer tmp = datas[0];  
            datas[0] = datas[i - 1];  
            datas[i - 1] = tmp;  

            for(Integer data : datas) {
    			System.out.print(data + "\t");
    		}
            System.out.println();
            // 堆的长度减少1,排除置换到最后位置的根节点  
            maxHeapify(datas, 1, i - 1);  
        }  
    }  

    // 根据输入数组构建一个最大堆  
    private static void buildMaxHeap(Integer[] data) {  
    	// 其中有一般是叶子节点,不需要全部进行构建
        for (int i = data.length / 2; i > 0; i--) {  
            maxHeapify(data, i, data.length);  
        }  
    }  

    //堆调整,使其生成最大堆  
    private static void maxHeapify(Integer[] data, int parentNodeIndex, int heapSize) {  
        // 计算左节点索引
        int leftChildNodeIndex = parentNodeIndex * 2;  
        // 计算右节点索引  
        int rightChildNodeIndex = parentNodeIndex * 2 + 1;  
        // 最大节点索引  
        int largestNodeIndex = parentNodeIndex;  

        // 如果左节点存在并且左子节点大于父节点,则将左子节点作为最大节点  
        if (leftChildNodeIndex <= heapSize && data[leftChildNodeIndex - 1] > data[parentNodeIndex - 1]) {  
            largestNodeIndex = leftChildNodeIndex;  
        }  

        // 如果有节点存在并且右子节点比最大节点还大,那么最大节点应该是右子节点  
        if (rightChildNodeIndex <= heapSize && data[rightChildNodeIndex - 1] > data[largestNodeIndex - 1]) {  
            largestNodeIndex = rightChildNodeIndex;  
        }  

        // 最后,如果最大节点和父节点不一致,则交换他们的值  
        if (largestNodeIndex != parentNodeIndex) {  
            Integer tmp = data[parentNodeIndex - 1];  
            data[parentNodeIndex - 1] = data[largestNodeIndex - 1];  
            data[largestNodeIndex - 1] = tmp;  

            // 交换完父节点和子节点的值,对换了值的子节点检查是否符合最大堆的特性  
            maxHeapify(data, largestNodeIndex, heapSize);  
        }  
    }  
}  
 
分享到:
评论

相关推荐

    堆排序演示代码C++ heapsort.cpp

    本代码主要演示了堆排序的排序方法,代码在centos7中测试通过。 编译方法使用g++ heapsort.cpp -o heapsort,运行heapsort即可

    堆排序 heapsort

    在这个代码中,`heapify`函数用于调整堆,`heapSort`函数首先通过`buildHeap`过程构建堆,然后通过不断地交换堆顶元素和末尾元素并调整堆来完成排序。 在数据结构的学习中,理解堆排序的原理和实现是至关重要的,...

    heapsort C语言实现

    heapsort

    堆排序 heapsort c语言实现

    c语言实现堆排序算法 heapsort 排序算法 。采用随机产生100个数 利用堆排序 。排序1000次 计算排序用的时间。

    c语言实现堆排序算法 heapsort

    堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 堆排序的平均时间复杂度为Ο...

    heapsort

    基于c++的堆积排序算法。排序算法大体可分为两种: 一种是比较排序,时间复杂度O(nlogn) ~ O(n^2),主要有:冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序等。 另一种是非比较排序,时间复杂度可以达到...

    heapsort.rar

    在这个"heapsort.rar"压缩包中,包含了一个名为"heapsort.cpp"的源代码文件,这应该是用C++语言实现的堆排序程序。下面,我们将深入探讨堆排序的基本原理、实现步骤以及其在C++中的应用。 堆排序的核心思想是建立一...

    排序算法-基于C语言实现的排序算法之HeapSort实现.zip

    在本资料中,我们将深入探讨一种高效的排序算法——堆排序(HeapSort)。 **C语言** C语言是一种强大的、高效的编程语言,常用于系统编程、嵌入式系统以及各种应用软件的开发。它的语法简洁明了,适合编写底层算法...

    sort-使用C++实现的排序算法之HeapSort.zip

    本主题聚焦于C++实现的HeapSort(堆排序)算法,这是一种高效的、基于比较的排序方法。HeapSort利用了二叉堆的数据结构特性来实现排序,其过程分为两个主要阶段:构建最大(或最小)堆和交换堆顶元素。 **1. 堆的...

    09 HeapSort.zip

    《严蔚敏数据结构与算法:HeapSort深度解析》 在计算机科学中,数据结构与算法是编程的基础,其中排序算法扮演着至关重要的角色。HeapSort(堆排序)是一种基于比较的排序算法,由Napier和Rabin于1964年提出,后经...

    DataStructure_Heap_heapsort_heap_Datastructure_made_

    `heapsort`是一种基于堆的数据排序算法。其工作原理是首先将无序序列构造成一个大顶堆(或小顶堆),然后将堆顶元素与末尾元素交换,使末尾成为最大元素(或最小元素)。接着,对剩余n-1个元素重新调整为堆,再将堆...

    qsort/heapsort/merge/BinarySearch/List实现

    自己写的一些简单算法和数据结构的代码 快排 堆排 归并 二分查找 单链表

    09 HeapSort.rar

    **堆排序(HeapSort)**是计算机科学中一种重要的排序算法,尤其在数据结构与算法的学习中占据着核心地位。这个名为“09 HeapSort”的压缩包文件,显然包含了关于堆排序的具体实现,很可能是严蔚敏教授的数据结构课程...

    runoob-algorithm-HeapSort.zip

    标题中的"runoob-algorithm-HeapSort.zip"暗示了我们即将探讨的是关于堆排序(HeapSort)的算法。堆排序是一种高效的排序算法,属于比较排序的一种,它利用了计算机科学中的树形数据结构——堆。 堆是一个近似完全...

    排序算法之HeapSort

    python 排序算法之HeapSort

    zoj 2665 Heapsort.md

    zoj 2665 Heapsort.md

    1_HeapSort.java

    1_HeapSort.java

    heapSort-heapSort

    heapSort-heapSort

    C语言实现堆排序heapSort算法

    我们首先实现了swap函数用于交换两个元素的值,然后实现了heapify函数用于调整堆,最后实现了heapSort函数用于进行堆排序。在main函数中,我们定义了一个数组并对其进行堆排序,然后打印排序前后的数组。运行该代码...

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

    堆排序(Heapsort)是一种基于比较的排序算法,它利用了数据结构中的二叉堆特性。在Java中,我们可以通过编写相应的代码来实现堆排序。以下是对标题和描述中涉及的知识点的详细说明: 1. **二叉堆**: - 二叉堆是一...

Global site tag (gtag.js) - Google Analytics