算法 – 堆排序(C)

算法 – 堆排序(C)分享一个大牛的人工智能教程 零基础 通俗易懂 风趣幽默 希望你也加入到人工智能的队伍中来 请 http www captainbed net 堆排序是一种选择排序 时间复杂度为 O nlog2 n 堆排序的特点是 在排序过程中 将待排序数组看成是一棵完全二叉树的顺序存储结构 利用完全二叉树中父结点和子结点之间的内在关系

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net

/*
* 堆排序是一种选择排序,时间复杂度为O(nlog2n)。
*
* 堆排序的特点是:
* 在排序过程中,将待排序数组看成是一棵完全二叉树的顺序存储结构,
* 利用完全二叉树中父结点和子结点之间的内在关系,在当前无序区中选择关键字最大(或最小)的记录。
*
* 基本思想
* 1.将待排序数组调整为一个大根堆。大根堆的堆顶元素就是这个堆中最大的元素。
* 2.将大根堆的堆顶元素和无序区最后一个元素交换,并将无序区最后一个位置列入有序区,然后将新的无序区调整为大根堆。
* 3.重复操作,直到无序区消失为止。
* 初始时,整个数组为无序区。每一次交换,都是将大根堆的堆顶元素换入有序区,以保证有序区是有序的。
*/

namespace HeapSort
{
using System;

///
/// The program.
///

public static class Program
{
///
/// 程序入口点。
///

public static void Main()
{
int[] a = {1, 14, 6, 2, 8, 66, 9, 3, 0, 10, 5, 34, 76, 809, 4, 7};

Console.WriteLine("Before Heap Sort:");
foreach (int i in a)
{
Console.Write(i + " ");
}

Console.WriteLine("\r\n");

Console.WriteLine("In Heap Sort:");
HeapSort(a);
Console.WriteLine("");

Console.WriteLine("After Heap Sort:");
foreach (int i in a)
{
Console.Write(i + " ");
}
}

///
/// 堆排序方法。
///

///
/// 待排序数组。
///
private static void HeapSort(int[] a)
{
// 建立大根堆。
BuildMaxHeap(a);
Console.WriteLine("Build max heap:");
foreach (int i in a)
{
// 打印大根堆。
Console.Write(i + " ");
}

Console.WriteLine("\r\nMax heap in each heap sort iteration:");
for (int i = a.Length - 1; i > 0; i--)
{
// 将堆顶元素和无序区的最后一个元素交换。
Swap(ref a[0], ref a[i]);

// 将新的无序区调整为大根堆。
MaxHeaping(a, 0, i);

// 打印每一次堆排序迭代后的大根堆。
for (int j = 0; j < i; j++)
{
Console.Write(a[j] + " ");
}

Console.WriteLine(string.Empty);
}
}

///
/// 由底向上建堆。
/// 由完全二叉树的性质可知,叶子结点是从index=a.Length/2开始,
/// 所以从index=(a.Length/2)-1结点开始由底向上进行大根堆的调整。
///

///
/// 待排序数组。
///
private static void BuildMaxHeap(int[] a)
{
for (int i = (a.Length / 2) - 1; i >= 0; i--)
{
MaxHeaping(a, i, a.Length);
}
}

///
/// 将指定的结点调整为堆。
///

///
/// 待排序数组。
///

///


/// 需要调整的结点。


///

/param>

br /> ///

param name="heapSize">

br /> /// 堆的大小,也指数组中无序区的长度。

br /> ///

br /> {

br /> large = left;

br /> }

br />

br /> // 比较右子结点。

br /> if (right

heapSize && a[right] >a[large])


{


large = right;


}



// 如有子结点大于自身就交换,使大的元素上移;并且把该大的元素调整为堆以保证堆的性质。


if (i != large)


{


Swap(ref a[i], ref a[large]);


MaxHeaping(a, large, heapSize);


}


}



///


/// 交换两个整数的值。
///

///

整数a。

/param>

br /> ///

param name="b">整数b。


private static void Swap(ref int a, ref int b)
{
int tmp = a;
a = b;
b = tmp;
}
}
}

// Output:
/*
Before Heap Sort:
1 14 6 2 8 66 9 3 0 10 5 34 76 809 4 7

In Heap Sort:
Build max heap:
809 14 76 7 10 66 9 3 0 8 5 34 1 6 4 2
Max heap in each heap sort iteration:
76 14 66 7 10 34 9 3 0 8 5 2 1 6 4
66 14 34 7 10 4 9 3 0 8 5 2 1 6
34 14 9 7 10 4 6 3 0 8 5 2 1
14 10 9 7 8 4 6 3 0 1 5 2
10 8 9 7 5 4 6 3 0 1 2
9 8 6 7 5 4 2 3 0 1
8 7 6 3 5 4 2 1 0
7 5 6 3 0 4 2 1
6 5 4 3 0 1 2
5 3 4 2 0 1
4 3 1 2 0
3 2 1 0
2 0 1
1 0
0

After Heap Sort:
0 1 2 3 4 5 6 7 8 9 10 14 34 66 76 809
*/
编程小号
上一篇 2025-01-18 07:46
下一篇 2025-01-18 07:33

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/hz/148565.html