• 堆排序——算法系列


    堆排序:

    堆排序的思想,建立一个最大最小堆,通过不断取出堆顶的值,重建堆,再取出,得到排序。

    代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Diagnostics;
    using System.Net;
    using System.Threading;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                for (int i = 1; i <= 5; i++)
                {
                    List<int> list = new List<int>();
                    //插入2k个随机数到数组中
                    for (int j = 0; j < 2000; j++)
                    {
                        Thread.Sleep(1);
                        list.Add(new Random((int)DateTime.Now.Ticks).Next(0, 100000));
                    }
                    Console.WriteLine("\n第" + i + "次比较:");
                    Stopwatch watch = new Stopwatch();
                    watch.Start();
                    var result = list.OrderBy(single => single).ToList();//这里这个single=>single不懂
                    watch.Stop();
                    Console.WriteLine("\n系统的快速排序耗费时间:" + watch.ElapsedMilliseconds);
                    Console.WriteLine("输出前是十个数:"+string.Join(",",result.Take(10).ToList()));
                    watch.Start();
                    result = HeapSort(list);
                    watch.Stop();
                    Console.WriteLine("\n堆排序耗费时间:" + watch.ElapsedMilliseconds);
                    Console.WriteLine("输出前是十个数:" + string.Join(",", result.Take(10).ToList()));
                    
                }
                
                Console.ReadLine();
            }
            //堆排序算法
            static void HeapAdjust(List<int> list, int parent, int length)
            {
                int temp = list[parent];
                int child = 2 * parent + 1;
                while (child < length)
                {
                    if (child + 1 < length && list[child] < list[child + 1])
                        child++;
                    if (temp > list[child])
                        break;
                    list[parent] = list[child];
                    parent = child;
                    child = 2 * parent + 1;
                }
                list[parent] = temp;
            }
    
            public static List<int> HeapSort(List<int> list)
            {
                for (int i = list.Count / 2 - 1; i >= 0; i--)
                {
                    HeapAdjust(list, i, list.Count);
                }
    
                for (int i = list.Count - 1; i >= 0; i--)
                {
                    int temp = list[0];
                    list[0] = list[i];
                    list[i] = temp;
                    HeapAdjust(list, 0, i);
                }
                return list;
            }
        }
    }

    总结:堆排序一般的操作步骤就不说了,这里有一点要注意的就是,初始建堆的时候,是从叶子节点开始调整,一直到根,这样才能得到正确的堆。

  • 相关阅读:
    animation——鼠标放上图片旋转
    docker安装Redis并设置密码
    Docker安装MySQL详细教程(mysql是5.7版本,可以根据自己需要修改版本)
    Linux安装jdk(两种方式)
    Nginx http 反向代理高级应用
    jenkins 远程启动tomcat报错:Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
    从一个Git仓库转移到另外一个仓库
    使用Spring @DependsOn控制bean加载顺序
    Swagger2异常:Illegal DefaultValue null for parameter type integer java
    springboot的实体类Integer和int如何选择
  • 原文地址:https://www.cnblogs.com/7ants/p/2955424.html
Copyright © 2020-2023  润新知