算法 – 堆排序(C#)

算法 – 堆排序(C#)分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net/**堆排序是一种选择排序,时间复杂度为O(nlog<sub>2</sub>n)。**堆排序的特点是:*在排序过程中,将待排序数组看成是一棵完全二叉树的顺序存储结构,*利用完全二叉树中父结点和…

大家好,又见面了,我是你们的朋友全栈君。

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net 

/*
 * 堆排序是一种选择排序,时间复杂度为O(nlog<sub>2</sub>n)。
 * 
 * 堆排序的特点是:
 * 在排序过程中,将待排序数组看成是一棵完全二叉树的顺序存储结构,
 * 利用完全二叉树中父结点和子结点之间的内在关系,在当前无序区中选择关键字最大(或最小)的记录。
 *
 * 基本思想
 * 1.将待排序数组调整为一个大根堆。大根堆的堆顶元素就是这个堆中最大的元素。
 * 2.将大根堆的堆顶元素和无序区最后一个元素交换,并将无序区最后一个位置列入有序区,然后将新的无序区调整为大根堆。
 * 3.重复操作,直到无序区消失为止。
 * 初始时,整个数组为无序区。每一次交换,都是将大根堆的堆顶元素换入有序区,以保证有序区是有序的。
 */

namespace HeapSort
{
    using System;

    /// <summary>
    /// The program.
    /// </summary>
    public static class Program
    {
        /// <summary>
        /// 程序入口点。
        /// </summary>
        public static void Main()
        {
            int[] a = {1, 14, 6, 2, 8, 66, 9, 3, 0, 10, 5, 34, 76, 809, 4, 7};

            Console.WriteLine("Before Heap Sort:");
            foreach (int i in a)
            {
                Console.Write(i + " ");
            }

            Console.WriteLine("\r\n");

            Console.WriteLine("In Heap Sort:");
            HeapSort(a);
            Console.WriteLine("");

            Console.WriteLine("After Heap Sort:");
            foreach (int i in a)
            {
                Console.Write(i + " ");
            }
        }

        /// <summary>
        /// 堆排序方法。
        /// </summary>
        /// <param name="a">
        /// 待排序数组。
        /// </param>
        private static void HeapSort(int[] a)
        {
            // 建立大根堆。
            BuildMaxHeap(a);
            Console.WriteLine("Build max heap:");
            foreach (int i in a)
            {
                // 打印大根堆。
                Console.Write(i + " ");
            }

            Console.WriteLine("\r\nMax heap in each heap sort iteration:");
            for (int i = a.Length - 1; i > 0; i--)
            {
                // 将堆顶元素和无序区的最后一个元素交换。
                Swap(ref a[0], ref a[i]);

                // 将新的无序区调整为大根堆。
                MaxHeaping(a, 0, i);

                // 打印每一次堆排序迭代后的大根堆。
                for (int j = 0; j < i; j++)
                {
                    Console.Write(a[j] + " ");
                }

                Console.WriteLine(string.Empty);
            }
        }

        /// <summary>
        /// 由底向上建堆。
        /// 由完全二叉树的性质可知,叶子结点是从index=a.Length/2开始,
        /// 所以从index=(a.Length/2)-1结点开始由底向上进行大根堆的调整。
        /// </summary>
        /// <param name="a">
        /// 待排序数组。
        /// </param>
        private static void BuildMaxHeap(int[] a)
        {
            for (int i = (a.Length / 2) - 1; i >= 0; i--)
            {
                MaxHeaping(a, i, a.Length);
            }
        }

        /// <summary>
        /// 将指定的结点调整为堆。
        /// </summary>
        /// <param name="a">
        /// 待排序数组。
        /// </param>
        /// <param name="i">
        /// 需要调整的结点。
        /// </param>
        /// <param name="heapSize">
        /// 堆的大小,也指数组中无序区的长度。
        /// </param>
        private static void MaxHeaping(int[] a, int i, int heapSize)
        {
            // 左子结点。
            int left = (2 * i) + 1;

            // 右子结点。
            int right = 2 * (i + 1);

            // 临时变量,存放大的结点值。
            int large = i;

            // 比较左子结点。
            if (left < heapSize && a[left] > a[large])
            {
                large = left;
            }

            // 比较右子结点。
            if (right < heapSize && a[right] > a[large])
            {
                large = right;
            }

            // 如有子结点大于自身就交换,使大的元素上移;并且把该大的元素调整为堆以保证堆的性质。
            if (i != large)
            {
                Swap(ref a[i], ref a[large]);
                MaxHeaping(a, large, heapSize);
            }
        }

        /// <summary>
        /// 交换两个整数的值。
        /// </summary>
        /// <param name="a">整数a。</param>
        /// <param name="b">整数b。</param>
        private static void Swap(ref int a, ref int b)
        {
            int tmp = a;
            a = b;
            b = tmp;
        }
    }
}

// Output:
/*
Before Heap Sort:
1 14 6 2 8 66 9 3 0 10 5 34 76 809 4 7

In Heap Sort:
Build max heap:
809 14 76 7 10 66 9 3 0 8 5 34 1 6 4 2
Max heap in each heap sort iteration:
76 14 66 7 10 34 9 3 0 8 5 2 1 6 4
66 14 34 7 10 4 9 3 0 8 5 2 1 6
34 14 9 7 10 4 6 3 0 8 5 2 1
14 10 9 7 8 4 6 3 0 1 5 2
10 8 9 7 5 4 6 3 0 1 2
9 8 6 7 5 4 2 3 0 1
8 7 6 3 5 4 2 1 0
7 5 6 3 0 4 2 1
6 5 4 3 0 1 2
5 3 4 2 0 1
4 3 1 2 0
3 2 1 0
2 0 1
1 0
0

After Heap Sort:
0 1 2 3 4 5 6 7 8 9 10 14 34 66 76 809
*/

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/157970.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 2019最新PHP模拟面试题及答案「建议收藏」

    2019最新PHP模拟面试题及答案「建议收藏」PHP模拟面试题汇总如下:1.如何防止form表单重复提交?2.Cookie被禁用了session还可以使用吗?3.你了解的或者用过的版本控制工具有哪些?简单说明一下。CVS,SVN,vss,git4.单例模式的优点,如何实现?5.单引号和双引号的区别是什么?(1)双引号可以解析变量,单引号不能解析变量(2)双引号和单引号可以互相嵌套(3)双引号当中的变量可以使用特殊字符分隔…

    2022年8月27日
    2
  • 您的pycharm评估已过期_pycharm许可证过期

    您的pycharm评估已过期_pycharm许可证过期2020年10月国企,看来需每年操作一次

    2022年8月26日
    8
  • pycharm使用技巧及常用快捷键_pycharm快捷键大全图

    pycharm使用技巧及常用快捷键_pycharm快捷键大全图Pycharm常用快捷键1、编辑(Editing)Ctrl+Space基本的代码完成(类、方法、属性)Ctrl+Alt+Space快速导入任意类Ctrl+Shift+Enter语句完成Ctrl+P参数信息(在方法中调用参数)Ctrl+Q快速查看文档F1外部文档Shift+F1外部文档,进入web文档主页Ctrl+Shift+Z–>Redo重做Ctrl+鼠标简介/进入代码定义Ctrl+F1显示错误描述或警告.

    2022年8月26日
    4
  • 【算法千题案例】每日一练LeetCode打卡——107.重塑矩阵「建议收藏」

    【算法千题案例】每日一练LeetCode打卡——107.重塑矩阵「建议收藏」算法题打卡:重塑矩阵。没有特别幸运,那么请先特别努力,别因为懒惰而失败,还矫情地将原因归于自己倒霉。所以说,树倒了,没有一片雪花是无辜的

    2022年10月20日
    0
  • FAE 之行小结

    FAE 之行小结本人在 FAE 的过程中的一些感悟 在即将转行之际作了一些小结 希望给初入 FAE 的同仁们一些认识 能帮助到大家在该岗位上能得心应手 1 担当的职责 FAE fieldapplica 其主要职责对应销售与客户接触 将客户的需求与本公司的产品所能实现的功能相结合 为客户提供解决解决方案 直到后期的现场调试及问题解决与反馈 在不同的阶段其充当的作用也有所不同

    2025年6月20日
    0
  • 安装pyodbc_编程python是什么

    安装pyodbc_编程python是什么1、连接数据库pipinstallpyodbc成功后就可以用了首先要importpyodbc1)直接连接数据库和创建一个游标(cursor)cnxn=pyodbc.connect(‘DRIVER={SQLServer};SERVER=localhost;DATABASE=testdb;UID=me;PWD=pass’)cursor=cnxn.cursor()2)使用DSN连接。通常DSN连接并不需要密码,还是需要提供一个PSW的关键字。cnxn=pyodb

    2022年4月19日
    59

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号