C#算法设计排序篇之06-堆排序(附带动画演示程序)

C#算法设计 专栏收录该内容
18 篇文章 7 订阅

堆排序(Heap Sort)

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/685 访问。

堆排序是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的升序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。


示例: 

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;
    }

}

以上是堆排序算法的一种实现,以下是这个案例的输出结果:

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/685 访问。

8 11 21 28 32 43 48 56 69 72 80 94

分析:

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


AlgorithmMan:

AlgorithmMan by Iori,AlgorithmMan是使用C#开发的一套用于算法演示的工具。

下载链接:AlgorithmMan-HeapSort

  • 3
    点赞
  • 2
    评论
  • 4
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值