推荐使用堆排序,复杂度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;
}
}