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);
        }
    }
}
相关推荐
LF男男3 分钟前
Action- C# 内置的委托类型
java·开发语言·c#
cpp_250122 分钟前
P2639 [USACO09OCT] Bessie‘s Weight Problem G
数据结构·算法·动态规划·题解·洛谷·背包dp
郝学胜-神的一滴32 分钟前
[力扣 227] 双栈妙解表达式计算:从思维逻辑到C++实战,吃透反向波兰式底层原理
java·前端·数据结构·c++·算法
LDG_AGI36 分钟前
【搜索引擎】Elasticsearch(六):向量搜索深度解析:从参数原理到混合查询实战
人工智能·深度学习·算法·elasticsearch·机器学习·搜索引擎
会编程的土豆37 分钟前
【数据结构与算法】二叉树深度
算法·深度优先
knight_9___1 小时前
RAG面试篇9
java·人工智能·python·算法·agent·rag
贾斯汀玛尔斯1 小时前
每天学一个算法--Top-K 查询(Top-K Retrieval)
算法
菜鸟丁小真1 小时前
LeetCode hot100 -131.分割回文串
数据结构·算法·leetcode·知识点总结
贾斯汀玛尔斯1 小时前
每天学一个算法--PageRank
算法
子琦啊1 小时前
【算法复习】滑动窗口(同向区间指针)
算法