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