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);
        }
    }
}
相关推荐
pianmian13 小时前
python数据结构基础(7)
数据结构·算法
好奇龙猫5 小时前
【学习AI-相关路程-mnist手写数字分类-win-硬件:windows-自我学习AI-实验步骤-全连接神经网络(BPnetwork)-操作流程(3) 】
人工智能·算法
sp_fyf_20245 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-01
人工智能·深度学习·神经网络·算法·机器学习·语言模型·数据挖掘
弗锐土豆6 小时前
Windows系统中Oracle VM VirtualBox的安装
windows·虚拟机·virtualbox
ChoSeitaku6 小时前
链表交集相关算法题|AB链表公共元素生成链表C|AB链表交集存放于A|连续子序列|相交链表求交点位置(C)
数据结构·考研·链表
秋の花6 小时前
【JAVA基础】Java集合基础
java·开发语言·windows
偷心编程6 小时前
双向链表专题
数据结构
香菜大丸6 小时前
链表的归并排序
数据结构·算法·链表
jrrz08286 小时前
LeetCode 热题100(七)【链表】(1)
数据结构·c++·算法·leetcode·链表
oliveira-time6 小时前
golang学习2
算法