查找最小的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;
        }
    }

  

原文地址:https://www.cnblogs.com/wuMing-dj/p/3370681.html