【愚公系列】2021年11月 C#版 数据结构与算法解析(选择排序-堆排序)

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【愚公系列】2021年11月 C#版 数据结构与算法解析(选择排序-堆排序)

1、堆排序(Heap Sort)

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


1.1 算法描述

将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无序区;

将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R[1,2…n-1]<=R[n];

由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,……Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2….Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。

1.2 动图演示

image.png



1.3 代码实现

/// <summary>

/// 堆排序

/// </summary>

public class Program {

   public static void Main(string[] args) {

       int[] array = { 43, 69, 11, 72, 28, 21, 56, 80, 48, 94, 32, 8 };

       HeapSort(array);

       ShowSord(array);

       Console.ReadKey();

   }

   private static void ShowSord(int[] array) {

       foreach (var num in array) {

           Console.Write($"{num} ");

       }

       Console.WriteLine();

   }

   private static void HeapSort(int[] array) {

       MaxHeap(array);

       for (int i = array.Length - 1; i > 0; i--) {

           Swap(ref array[0], ref array[i]);

           Heapify(array, 0, i);

       }

   }

   private static void MaxHeap(int[] array) {

       for (int i = array.Length / 2 - 1; i >= 0; i--) {

           Heapify(array, i, array.Length);

       }

   }

   private static void Heapify(int[] array, int index, int size) {

       int left = 2 * index + 1;

       int right = 2 * index + 2;

       int large = index;

       if (left < size && array[left] > array[large]) {

           large = left;

       }

       if (right < size && array[right] > array[large]) {

           large = right;

       }

       if (index != large) {

           Swap(ref array[index], ref array[large]);

           Heapify(array, large, size);

       }

   }

   private static void Swap(ref int first, ref int second) {

       int t = first;

       first = second;

       second = t;

   }

}

堆排序算法的时间复杂度不难证明为: O(n*logn) 。


相关文章
|
8天前
|
存储 算法 C#
C#哈希查找算法
C#哈希查找算法
|
8天前
|
算法 C# 索引
C#二分查找算法
C#二分查找算法
|
11天前
|
算法 搜索推荐
数据结构与算法学习十八:堆排序
这篇文章介绍了堆排序是一种通过构建堆数据结构来实现的高效排序算法,具有平均和最坏时间复杂度为O(nlogn)的特点。
50 0
数据结构与算法学习十八:堆排序
|
11天前
|
算法 搜索推荐
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
本文介绍了冒泡排序、选择排序和插入排序三种基础排序算法的原理、实现代码和测试结果。
12 0
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
|
15天前
|
搜索推荐
冒泡排序(Bubble Sort)以及选择排序(Selection Sort)和快速排序(Quick Sort)详细解析
冒泡排序(Bubble Sort)以及选择排序(Selection Sort)和快速排序(Quick Sort)详细解析
11 1
|
19天前
|
搜索推荐 C++
【初阶数据结构】深度解析七大常见排序|掌握底层逻辑与原理(一)
【初阶数据结构】深度解析七大常见排序|掌握底层逻辑与原理
|
19天前
|
搜索推荐 索引
【初阶数据结构】深度解析七大常见排序|掌握底层逻辑与原理(二)
【初阶数据结构】深度解析七大常见排序|掌握底层逻辑与原理
|
15天前
|
搜索推荐 算法
【排序算法(一)】——插入排序,选择排序 —> 深层解析
【排序算法(一)】——插入排序,选择排序 —> 深层解析
|
17天前
|
存储 算法 搜索推荐
数据结构--堆的深度解析
数据结构--堆的深度解析
|
17天前
|
机器学习/深度学习 算法 数据挖掘
使用C# 实现期望最大化算法
使用C# 实现期望最大化算法
36 0

推荐镜像

更多