首页 > 其他分享 >堆排序

堆排序

时间:2023-03-03 14:47:18浏览次数:45  
标签:arr int 堆排序 结点 large 节点

【经典算法】:堆排序 

1.概述

堆排序(Heap Sort)就是利用堆(假设利用大顶堆)进行排序的方法。

原理:将待排序的序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根结点,将 它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中的次小值。,如此反复执行,便能得到一个有序序列了,堆排序的时间复杂度为O(nlogn)。

1.1 什么是堆

这里的堆(二叉堆),指得不是堆栈的那个堆,而是一种数据结构。堆可以视为一棵完全的二叉树,完全二叉树的一个“优秀”的性质是,除了最底层之外,每一层都是满的,这使得堆可以利用数组来表示,每一个结点对应数组中的一个元素.
数组与堆之间的关系

Heap1

二叉堆一般分为两种:最大堆和最小堆。

1.2 什么是最大堆

堆中每个父节点的元素值都大于等于其孩子结点(如果存在),这样的堆就是一个最大堆,因此,最大堆中的最大元素值出现在根结点(堆顶)

1.3 节点与数组索引关系

对于给定的某个结点的下标i,可以很容易的计算出这个结点的父结点、孩子结点的下标,而且计算公式很漂亮很简约

Image(2)

1.4 调整过程

在4,14,7这个小堆里边,父节点4小于左孩子14,所以两者交换,在4,2,8这个小堆里边,父节点4小于右孩子8,所以两者交换

Heap3

上图展示了一趟调整的过程,这个过程递归实现,直到调整为最大堆为止。

1.5 整个堆排序过程

堆排序就是把堆顶的最大数取出,将剩余的堆继续调整为最大堆,以递归实现,剩余部分调整为最大堆后,再次将堆顶的最大数取出,再将剩余部分调整为最大堆,这个过程持续到剩余数只有一个时结束。下边三张图详细描述了整个过程。

Heap4

Heap5

Heap6

2.示例

复制代码
        //堆排序
        public static void HeapSort(int[] arr)
        {
            BuildMaxHeap(arr);

            for (int i = (arr.Length - 1); i > 0; i--)
            {
                //将堆顶元素和无序区的最后一个元素交换 
                int temp = arr[i];
                arr[i] = arr[0];
                arr[0] = temp;
                MaxHeaping(arr, 0, i); //将新的无序区调整为堆  
            }
        }
        /// <summary>  
        /// 初始化大根堆,由底向上建堆  
        /// 完全二叉树的基本性质,最底层节点是n/2,所以从arr.Length/2开始  
        /// </summary>  
        private static void BuildMaxHeap(int[] arr)
        {
            for (int i = (arr.Length / 2) - 1; i >= 0; i--)
            {
                MaxHeaping(arr, i, arr.Length);
            }
        }
        /// <summary>  
        /// 将指定的节点调整为堆  
        /// </summary>  
        /// <param name="i">需要调整的节点</param>  
        /// <param name="heapSize">堆的大小,也指数组中无序区的长度</param>  
        private static void MaxHeaping(int[] arr, int i, int heapSize)
        {
            int left = 2 * i + 1; // 左子节点  
            int right = 2 * i + 2; // 右子节点  
            int large = i; // 临时变量,存放大的节点值  

            if (left < heapSize && arr[left] > arr[large])
            {
                large = left;
            }
            // 比较右子节点  
            if (right < heapSize && arr[right] > arr[large])
            {
                large = right;
            }
            // 如有子节点大于自身就交换,使大的元素上移  
            if (i != large)
            {
                int temp = arr[i];
                arr[i] = arr[large];
                arr[large] = temp; ;
                MaxHeaping(arr, large, heapSize);
            }
        }
        // int[] list = new[] { 16, 14, 10, 8, 7, 9, 3, 2, 4, 1 };
        // Sorter.HeapSort(list);
复制代码

 参考:http://blog.kingsamchen.com/archives/547#viewSource

 

标签:arr,int,堆排序,结点,large,节点
From: https://www.cnblogs.com/huangkai00000/p/17175571.html

相关文章

  • 数据结构与算法【基础版】:4.9 常用排序算法之堆排序(属于选择排序)【简单选择排序在3.6
    堆排序大顶堆:父节点始终大于任意子节点小顶堆:任意一个子节点都比父节点大思路:先找到最后一个非叶子节点,即最后一个节点的父节点和他的左右节点比较,左右节点大的情况和父节点......
  • 堆排序 golang实现
    堆排序golang实现大根堆直接上代码,有问题联系我packagesortimport"testing"funcHeapSort(arr[]int)[]int{ iflen(arr)<=1{ returnarr } fori:=......
  • 堆排序
    leetcode-FindKthLargestpublicclassKthLargest{publicstaticvoidmain(String[]args){System.out.println(findKthLargest(newint[]{3,2,1,5,6,4}......
  • 算法导论:堆排序
    维护堆主要思想比较\(A[i],A[Left(i)]\)和\(A[Right(i)]\)的大小如果\(A[i]\)不是最大的,则将其与比较大的孩子节点进行交换在堆中继续向下比较和交换,直到\(i......
  • 选择排序+堆排序(实现)
    王道督学营17.1/*Description读取10个整型数据1263589541356503844,然后通过选择排序,堆排序,分别对该组数据进行排序,输出2次有序结果,每个数的输出占3个空格完......
  • 堆排序(Heap Sort)
    一、算法概述1.1算法分类十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排......
  • 17种编程语言实现排序算法-堆排序
    开源地址​​https://gitee.com/lblbc/simple-works/tree/master/sort/​​覆盖语言:C、C++、C#、Java、Kotlin、Dart、Go、JavaScript(JS)、TypeScript(TS)、ArkTS、swift、......
  • 【算法-堆排序】Go语言实现
    堆排序通过数组构造堆,根节点是最大的元素是大根堆,相反为小根堆主要有俩个方法,插入InsertHeap,调整堆:heapify对于排序来说:先把数组构造成一个大根堆,然后[0]依次......
  • p24-p25参数返回值局部变量以及堆排序代码实现
    函数的返回值8位(一个字节)则放到al16位放ax32位放eax64位放raxoffset偏移(可看作一个具体的地址参数传递的办法:1.寄存器2.堆栈整数类型的参数,一律使用int类型:无论......
  • C++ 不知树系列之二叉堆排序(递归和非递归实现上沉、下沉算法)
    1.前言什么是二叉堆?二叉堆是有序的完全二叉树,在完全二叉树的基础上,二叉堆提供了有序性特征:二叉堆的根结点上的值是整个堆中的最小值或最大值。当根结点上的值......