C#算法之堆排序算法

算法释义:堆排序算法的基本原理,其实就是利用二叉堆的数据结构,通过构建一个最大堆,然后将堆顶元素(最大值)与末尾元素交换,接着缩小堆的大小并重新调整堆,直到堆中只剩下一个元素。

C#实现堆排序大致包括以下两个步骤:

1、构建最大堆。从最后一个非叶子节点开始,向上逐个节点进行下沉操作,直到堆顶。

2、执行排序。将堆顶元素与堆的最后一个元素交换,然后缩小堆的范围,重新调整堆,直到堆中只剩下一个元素。

简单的示例代码如下:

cs 复制代码
class Program
{
    static void Main()
    {
        int[] arr = { 12, 11, 13, 5, 6, 7 };
        int n = arr.Length;

        HeapSort(arr, n);

        // 打印排序后的数组
        Console.WriteLine("Sorted array: ");
        foreach (int item in arr)
        {
            Console.Write(item + " ");
        }
    }

    // 堆排序函数
    static void HeapSort(int[] arr, int n)
    {
        // 构建最大堆
        for (int i = n / 2 - 1; i >= 0; i--)
            Heapify(arr, n, i);

        // 执行排序
        for (int i = n - 1; i > 0; i--)
        {
            // 交换堆顶元素和当前堆的最后一个元素
            int temp = arr[0];
            arr[0] = arr[i];
            arr[i] = temp;

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

    // 调整堆以确保堆的性质
    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 temp = arr[i];
            arr[i] = arr[largest];
            arr[largest] = temp;

            // 继续下沉
            Heapify(arr, n, largest);
        }
    }
}
相关推荐
fancy16616624 分钟前
搜索二维矩阵 II
c++·算法·矩阵
freyazzr26 分钟前
Leetcode刷题 | Day63_图论08_拓扑排序
数据结构·c++·算法·leetcode·图论
暴龙胡乱写博客31 分钟前
机器学习 --- KNN算法
人工智能·算法·机器学习
一梦浮华31 分钟前
自学嵌入式 day 18 - 数据结构 1
数据结构
ai.Neo1 小时前
牛客网NC22015:最大值和最小值
数据结构·c++·算法
Swift社区2 小时前
LeetCode 高频题实战:如何优雅地序列化和反序列化字符串数组?
算法·leetcode·职场和发展
江沉晚呤时2 小时前
C# 实现雪花算法(Snowflake Algorithm)详解与应用
c#·.net
徐子童3 小时前
《从零开始入门递归算法:搜索与回溯的核心思想 + 剑指Offer+leetcode高频面试题实战(含可视化图解)》
算法
感谢地心引力3 小时前
【Matlab】最新版2025a发布,深色模式、Copilot编程助手上线!
开发语言·windows·matlab·copilot
天宫风子3 小时前
抽象代数小述(二之前)
经验分享·笔记·算法·生活·抽象代数