堆排序(HeapSort)是一树形选择排序。堆排序的特点是:在排序过程中,将R[l..n]看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系,在当前无序区中选择关键字最大(或最小)的记录。堆排序的时间,主要由建立初始]堆和反复重建堆这两部分的时间开销构成。
static void HeapSort(int[] intArr)
{
int numberOfLoop = 0;
int numberOfSwap = 0;
//第一次创建大堆
for (int i = intArr.Length / 2 - 1; i >= 0; i--)
{
numberOfLoop++;
HeapAdjust(intArr, i, intArr.Length, ref numberOfLoop, ref numberOfSwap);
}
//元素位置调换,无序区通过调整为有序区,获得最大的值
for (int i = intArr.Length - 1; i > 0; i--)
{
numberOfLoop++;
numberOfSwap++;
//堆顶(最大值)与当前堆的最后一个堆元素交换位置
int tmp = intArr[0];
intArr[0] = intArr[i];
intArr[i] = tmp;
//将剩下的无序堆部分重新建堆处理,因为只是将最大值转移,因此只需要一轮排序,获取最大值
HeapAdjust(intArr, 0, i, ref numberOfLoop, ref numberOfSwap);
}
DisplaySortResult(numberOfLoop, numberOfSwap, intArr);
}
static void HeapAdjust(int[] intArr, int i, int length, ref int numberOfLoop, ref int numberOfSwap)
{
int temp = intArr[i];
int child = 2 * i + 1;
while (child < length)
{
//如果存在右节点,且大于左节点,child++
if (child < length - 1 && intArr[child] < intArr[child + 1])
{
numberOfLoop++;
child++;
}
//父节点大于左右子节点,跳出循环
if (temp >= intArr[child]) break;
numberOfSwap++;
//否则设置父节点为最大的子节点值
intArr[i] = intArr[child];
i = child;
child = 2 * i + 1;
}
numberOfSwap++;
intArr[i] = temp;
}
和快速排序相比,速度差不多。

发表评论
相关文章
国内AI资源汇总,AI聊天、AI绘画、AI写作、AI视频、AI设计、AI编程、AI音乐等,国内顺畅访问,无需科学上网。
扫码或点击进入:萤火AI大全
文章分类
最新评论