Visual C# 诠释常用排序算法
发布时间:2006-09-29 13:14:08 来源:天极开发 网友评论 0 条 5. 堆排序
5.1. 基本思想:
堆排序是一树形选择排序,在排序过程中,将R[1..N]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素。
5.2. 堆的定义:
N个元素的序列K1,K2,K3,...,Kn.称为堆,当且仅当该序列满足特性:Ki≤K2i Ki ≤K2i+1(1≤ I≤ [N/2])。
堆实质上是满足如下性质的完全二叉树:树中任一非叶子结点的关键字均大于等于其孩子结点的关键字。例如序列10,15,56,25,30,70就是一个堆,它对应的完全二叉树如上图所示。这种堆中根结点(称为堆顶)的关键字最小,我们把它称为小根堆。反之,若完全二叉树中任一非叶子结点的关键字均大于等于其孩子的关键字,则称之为大根堆。
5.3. 排序过程:
堆排序正是利用小根堆(或大根堆)来选取当前无序区中关键字小(或最大)的记录实现排序的。我们不妨利用大根堆来排序。每一趟排序的基本操作是:将当前无序区调整为一个大根堆,选取关键字最大的堆顶记录,将它和无序区中的最后一个记录交换。这样,正好和直接选择排序相反,有序区是在原记录区的尾部形成并逐步向前扩大到整个记录区。
【示例】:对关键字序列42,13,91,23,24,16,05,88建堆。
5.4. 程序实现
总结:
人常说算法是程序的灵魂,在作项目的过程中时常注意且不可灵魂出窍。时常去回顾一下以前的数据重要性就如同基督徒每周要做礼拜一样。不能因为有了C# 和Java这种平台之后,就忽略了基础的重要性。
我用C#的控制台程序 把这几个算法实现了一下,代码在附件中,如有写的不好的地方,敬请指正。
5.1. 基本思想:
堆排序是一树形选择排序,在排序过程中,将R[1..N]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素。
5.2. 堆的定义:
N个元素的序列K1,K2,K3,...,Kn.称为堆,当且仅当该序列满足特性:Ki≤K2i Ki ≤K2i+1(1≤ I≤ [N/2])。
![]() |
堆实质上是满足如下性质的完全二叉树:树中任一非叶子结点的关键字均大于等于其孩子结点的关键字。例如序列10,15,56,25,30,70就是一个堆,它对应的完全二叉树如上图所示。这种堆中根结点(称为堆顶)的关键字最小,我们把它称为小根堆。反之,若完全二叉树中任一非叶子结点的关键字均大于等于其孩子的关键字,则称之为大根堆。
5.3. 排序过程:
堆排序正是利用小根堆(或大根堆)来选取当前无序区中关键字小(或最大)的记录实现排序的。我们不妨利用大根堆来排序。每一趟排序的基本操作是:将当前无序区调整为一个大根堆,选取关键字最大的堆顶记录,将它和无序区中的最后一个记录交换。这样,正好和直接选择排序相反,有序区是在原记录区的尾部形成并逐步向前扩大到整个记录区。
【示例】:对关键字序列42,13,91,23,24,16,05,88建堆。
![]() ![]() ![]() ![]() ![]() |
5.4. 程序实现
| /// <summary> /// 小根堆排序 /// </summary> /// <param name="dblArray"></param> /// <param name="StartIndex"></param> /// <returns></returns> private static void HeapSort(ref double[] dblArray ) { for(int i = dblArray.Length -1 ; i >= 0; i--) { if(2*i+1<dblArray.Length) { int MinChildrenIndex = 2*i+1 ; //比较左子树和右子树,记录最小值的Index if(2*i+2 < dblArray.Length ) { if(dblArray[2*i+1]>dblArray[2*i+2]) MinChildrenIndex = 2*i+2; } if(dblArray[i] > dblArray[MinChildrenIndex]) { ExchageValue(ref dblArray[i],ref dblArray[MinChildrenIndex]); NodeSort(ref dblArray ,MinChildrenIndex); } } } } /// <summary> /// 节点排序 /// </summary> /// <param name="dblArray"></param> /// <param name="StartIndex"></param> private static void NodeSort(ref double[] dblArray,int StartIndex) { while(2*StartIndex+1 < dblArray.Length) { int MinChildrenIndex = 2*StartIndex+1 ; if(2*StartIndex+2 < dblArray.Length ) { if(dblArray[2*StartIndex+1]>dblArray[2*StartIndex+2]) { MinChildrenIndex = 2*StartIndex+2; } } if(dblArray[StartIndex] > dblArray[MinChildrenIndex]) { ExchageValue(ref dblArray[StartIndex],ref dblArray[MinChildrenIndex]); StartIndex = MinChildrenIndex ; } } } /// <summary> /// 交换值 /// </summary> /// <param name="A"></param> /// <param name="B"></param> private static void ExchageValue(ref double A , ref double B) { double Temp = A ; A = B ; B = Temp ; } |
总结:
人常说算法是程序的灵魂,在作项目的过程中时常注意且不可灵魂出窍。时常去回顾一下以前的数据重要性就如同基督徒每周要做礼拜一样。不能因为有了C# 和Java这种平台之后,就忽略了基础的重要性。
我用C#的控制台程序 把这几个算法实现了一下,代码在附件中,如有写的不好的地方,敬请指正。
- 推荐阅讯
- 用VC实现对超长数据库字段的操作
- 用Visual C++实现PDF文件的显示
- Visual C++ 2005图像编程之属性设置栏
- 利用VC++实现AVI文件的合成和分解
- Visual C#2005快速入门之声明bool变量
- VC++设计基于ODBC的数据库管理系统
- 利用VC打造自己的资源浏览器
- 用DLL控制Windows中进程的方法
- Visual C# 2005快速入门之编写方法
- VC#2005快速入门之使用while语句
- 阅读排行
- 1.VC++编程实现广告窗口自动关闭
- 2.深入浅出VC++串口编程之基于控件
- 3.解读VC++编程中的文件操作API和CFile类
- 4.利用Visual C#实现ICMP网络协议
- 5.深入浅出VC++串口编程之第三方类
- 6.掀起你的盖头来——谈VC++对象模型
- 7.Visual C#中用WMI控制远程计算机
- 8.深入浅出VC++串口编程之基于Win32 API
- 9.Visual C++2005中开发自定义绘图控件
- 10.深入浅出VC++串口编程之基本概念
- 专题教程
- Windows Server-Windows Server文档-Windows Server新闻-Windows Ser PostgreSQL-PostgreSQL文档-PostgreSQL新闻-PostgreSQL专家
- WebLogic-WebLogic文档-WebLogic新闻-WebLogic专家 FreeBSD-FreeBSD文档-FreeBSD新闻-FreeBSD专家
- Linux-内核 GUI KDE Gnome DNS FTP 安全 安装-Linux专区 Windows-AD IIS ServerCore 虚拟化 安全 HPC-Windows专区
- 大话G游 专题:手机病毒揭密
- ARP攻击防范与解决方案 路由故障处理手册






