🏆 作者简介,愚公搬代码 🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。 🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏
排序算法是一种将一组数据按照特定的规则进行排列的方法。排序算法通常用于对数据的处理,使得数据能够更容易地被查找、比较和分析。
下面是常见的11种排序算法:
堆排序的基本思想是利用堆的性质来进行排序。堆是一种完全二叉树,具有两个性质:
堆排序的过程如下:
构建堆的时间复杂度为O(n),每次交换堆顶元素和堆尾元素的时间复杂度为O(1),重复步骤2和3的时间复杂度为O(nlogn)。因此堆排序的时间复杂度为O(nlogn),是一种比较高效的排序算法。
堆排序的时间复杂度为O(nlogn),空间复杂度为O(1)。
堆排序的核心是堆的建立和调整过程,堆排序采用了完全二叉树的性质,利用堆这种数据结构来实现排序。具体实现过程如下:
因为每次需要将堆顶元素与堆底元素交换,并对其进行调整,所以时间复杂度为O(nlogn)。空间复杂度由于堆是在原数组上建立的,因此空间复杂度为O(1)。
堆排序适用于数据量较大的排序,但不适用于数据量较小的排序,因为堆排序的常数因子较大,且在数据量较小的情况下,其他排序算法的优势更加明显。
堆排序的主要应用场景是在需要对大量数据进行排序的场合,特别是对于需要对数据进行实时处理的场合。以下是堆排序的一些应用场景:
总之,堆排序是一种非常高效的算法,可以应用于需要对大量数据进行排序的场合,特别是对于需要实时处理数据的场合。
/// <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;
}
}