前言

堆排序是一种高效的排序算法,基于二叉堆数据结构实现。它具有稳定性、时间复杂度为O(nlogn)和空间复杂度为O(1)的特点。

堆排序实现原理

  1. 构建最大堆:将待排序数组构建成一个最大堆,即满足父节点大于等于子节点的特性。
  2. 将堆顶元素与最后一个元素交换:将最大堆的堆顶元素与堆中的最后一个元素交换位置,将最大元素放到了数组的末尾。
  3. 重新调整堆:对剩余的n-1个元素进行堆调整,即将堆顶元素下沉,重新形成最大堆。
  4. 重复步骤2和3,直到堆中的所有元素都被排列好。

堆排序代码实现

        public static void HeapSort(int[] array)
        {
            int arrayLength = array.Length;

            //构建最大堆
            for (int i = arrayLength / 2 - 1; i >= 0; i--)
                Heapify(array, arrayLength, i);

            //依次取出堆顶元素,并重新调整堆
            for (int i = arrayLength - 1; i >= 0; i--)
            {
                //将堆顶元素与当前最后一个元素交换
                int temp = array[0];
                array[0] = array[i];
                array[i] = temp;

                //重新调整堆
                Heapify(array, i, 0);
            }
        }

        private static void Heapify(int[] arr, int n, int i)
        {
            int largest = i; //假设父节点最大
            int left = 2 * i + 1; //左子节点
            int right = 2 * i + 2; //右子节点

            //如果左子节点大于父节点,则更新最大值
            if (left < n && arr[left] > arr[largest])
                largest = left;

            //如果右子节点大于父节点和左子节点,则更新最大值
            if (right < n && arr[right] > arr[largest])
                largest = right;

            //如果最大值不是当前父节点,则交换父节点和最大值,并继续向下调整堆
            if (largest != i)
            {
                int swap = arr[i];
                arr[i] = arr[largest];
                arr[largest] = swap;

                Heapify(arr, n, largest);
            }
        }

        public static void HeapSortRun()
        {
            int[] array = { 19, 27, 46, 48, 50, 2, 4, 44, 47, 36, 38, 15, 26, 5, 3, 99, 888, 0, -1 };
            Console.WriteLine("排序前数组:" + string.Join(", ", array));

            HeapSort(array);

            Console.WriteLine("排序后数组:" + string.Join(", ", array));
        }

运行结果

总结

堆排序是一种高效的排序算法,通过构建最大堆和反复调整堆的操作,实现对数组的排序。其时间复杂度为O(nlogn),并且具有较好的稳定性和空间效率。但是由于其涉及大量的元素交换操作,所以在实际应用中,可能不如快速排序等算法效率高。

C#堆排序算法的更多相关文章

  1. 堆排序算法 java 实现

    堆排序算法 java 实现 白话经典算法系列之七 堆与堆排序 Java排序算法(三):堆排序 算法概念 堆排序(HeapSort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,可以利用数组的特 ...

  2. 必须知道的八大种排序算法【java实现】(三) 归并排序算法、堆排序算法详解

    一.归并排序算法 基本思想: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 归并 ...

  3. 堆排序算法(C#实现)

    在软件设计相关领域,“堆(Heap)”的概念主要涉及到两个方面: 一种是数据结构,逻辑上是一颗完全二叉树,存储上是一个数组对象(二叉堆). 另一种是垃圾收集存储区,是软件系统可以编程的内存区域. 本文 ...

  4. 【java排序】 归并排序算法、堆排序算法

    一.归并排序算法 基本思想: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 归并 ...

  5. Python3标准库:heapq堆排序算法

    1. heapq堆排序算法 堆(heap)是一个树形数据结构,其中子节点与父节点有一种有序关系.二叉堆(binary heap)可以使用一个有组织的列表或数组表示,其中元素N的子元素位于2*N+1和2 ...

  6. cb52a_c++_STL_堆排序算法make_push_pop_sort_heap

    cb52a_c++_STL_堆排序算法make_push_pop_sort_heapheapsort堆排序算法make_heap()-特殊的二叉树,每一个节点都比根小,根就是最大的数.大根堆,也可以做 ...

  7. Javascript中的冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序 算法性能分析

    阿里面试中有一道题是这样的: 请用JavaScript语言实现 sort 排序函数,要求:sort([5, 100, 6, 3, -12]) // 返回 [-12, 3, 5, 6, 100],如果你 ...

  8. Heapsort 堆排序算法详解(Java实现)

    Heapsort (堆排序)是最经典的排序算法之一,在google或者百度中搜一下可以搜到很多非常详细的解析.同样好的排序算法还有quicksort(快速排序)和merge sort(归并排序),选择 ...

  9. 堆排序算法的java实现

         堆积排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,可以利用数组的特点快速定位指定索引的元素.堆排序是不稳定的排序方法,辅助空间为O(1), 最坏时间复杂度为O ...

  10. 排序系列 之 堆排序算法 —— Java实现

       基本概念: 二叉堆是完全二叉树或者是近似完全二叉树. 当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆. 当父结点的键值总是小于或等于任何一个子节点的键值时为最小堆. 一般将二叉堆简称 ...

随机推荐

  1. SpringMVC的执行原理

    1.HandlerMapping为处理器映射,DispatcherServlet调用HandlerMapping,HandlerMapping根据请求的url查找Handler 2.HandlerEx ...

  2. 最为常用的Laravel操作(1)-Eloquent模型

    快速入门 更换表名 protected $table = 'my_flights'; 更换主键名称 protected $primaryKey = 'id'; 注意: Eloquent 默认主键字段是 ...

  3. Linux实现双击自动安装deb文件

    在Linux中,有几个常用的软件可以实现双击自动安装.deb文件的功能.以下是一些推荐的软件: 1. GDebi:GDebi是一个轻量级的图形化工具,专门用于安装.deb文件.它可以解决依赖关系,并提 ...

  4. Vue详解----一篇带你从头领悟到尾,享受飞升的感觉

    脚手架文件结构 """ ├── node_modules ├── public │ ├── favicon.ico: 页签图标 │ └── index.html: 主页面 ...

  5. k8s 的特点

    Kubernetes 的信条是基于自动化的.API 驱动的基础设施,同时避免组件间紧密耦合.

  6. protolator - Protobuf <==> json

    github.com/hyperledger/fabric-config/protolator 是 Hyperledger Fabric 中的一个 Go 包,用于将 Protocol Buffers( ...

  7. Codeforces Round 882 (Div. 2)

    Codeforces Round 882 (Div. 2) A.The Man who became a God 题目大意 给定一个数组 \({x_1,x_2,⋯,x_n}\) 和一个整数 \(k\) ...

  8. 2023HWS_RE复现

    2023HWS_RE复现 参考wp:https://oacia.cc/hws-2023/ Android 参考这篇文章:https://www.52pojie.cn/thread-1680984-1- ...

  9. Spring面试攻略:如何展现你对Spring的深入理解

    什么是Spring?谈谈你对IOC和AOP的理解. Spring是一种Java开发框架,旨在简化企业级应用程序的开发和部署.它具有以下优点: 对象托管:Spring能够管理和赋值所有对象,使开发人员不 ...

  10. 1Nginx基础及编译安装

    1Nginx基础 1.Nginx概述 Nginx 功能介绍 Nginx(发音为"engine-x")是一个开源的高性能 HTTP和反向代理服务器.它具有以下功能: 1.静态文件服务 ...