• 查找最小的k个元素(数组)


    推荐使用堆排序,复杂度0(n*lgn)

    /// <summary>
        /// 利用堆排序选出数组的最小的k个元素
        /// </summary>
        public class HeapSort
        {
            /// <summary>
            /// 大根堆排序
            /// </summary>
            public static void Sort()
            {
                int[] array = { 1, 3, 7, 5, 2, 8, 4, 6, 10, 9 };
    
                //创建大根堆,父节点都大于子节点
                CreateHeap(array);
    
                //轮询地将大根堆的根元素置换到有序区
                for (int i = array.Length-1; i > -1; i--) //索引递减
                {
                    Swap(array, 0, i);
                    //根元素置换后重新调整根堆
                    Adjust(array, 0, i-1);
                }
    
                //显示出来
                array.ToList<int>().ForEach(item => { Console.Write(item + ","); });
            }
    
            /// <summary>
            /// 创建大根堆
            /// </summary>
            /// <param name="array"></param>
            public static void CreateHeap(int[] array)
            {
                for (int i = array.Length-1; i > -1; i--) //索引递减
                {
                    Adjust(array, i, array.Length - 1);
                }
            }
    
            /// <summary>
            /// 调整数组指定部分为大根堆结构
            /// </summary>
            /// <param name="array">数组</param>
            /// <param name="start">起始索引</param>
            /// <param name="end">结束索引</param>
            public static void Adjust(int[] array, int start, int end)
            {
                //根节点
                int root = start;
    
                //左子结点
                int left = (root + 1) * 2 - 1;
                if (left > end)
                    return;
                int max = left;//最大子节点
    
               //右子结点
                int right = (root + 1) * 2 ;
                if (right < end && array[right] > array[max])
                {
                    max = right;
                }
    
                //最大子节点与父节点交换
                if (array[max] > array[root])
                {
                    Swap(array, max, root);
                    //交换之后,最大子节点重新调整大根堆
                    Adjust(array, max, end);
                }
            }
    
            public static void Swap(int[] array, int index1, int index2)
            {
                int swapTemp = array[index1];
                array[index1] = array[index2];
                array[index2] = swapTemp;
            }
        }
    

      

  • 相关阅读:
    IIS配置ThinkPHP重写
    Redis安装
    ubuntu学习笔记
    PHP连接MySQL数据库SELinux中一些setsebool的用法
    centos+frp
    centos7.6安装nginx
    在CentOS 7-8上安装PHP 8.0
    centos7安装.net5.0(core)
    阿里云服务器配置清单
    阿里云服务器centos7.6安装mysql8.0.23
  • 原文地址:https://www.cnblogs.com/wuMing-dj/p/3370681.html
Copyright © 2020-2023  润新知