Visual C# 诠释常用排序算法
发布时间:2006-09-29 13:14:08 来源:天极开发 网友评论 0 条 4. 快速排序
4.1. 基本思想:
在当前无序区R[1..H]中任取一个数据元素作为比较的"基准"(不妨记为X),用此基准将当前无序区划分为左右两个较小的无序区:R[1..I-1]和R[I+1..H],且左边的无序子区中数据元素均小于等于基准元素,右边的无序子区中数据元素均大于等于基准元素,而基准X则位于最终排序的位置上,即R[1..I-1]≤X.Key≤R[I+1..H](1≤I≤H),当R[1..I-1]和R[I+1..H]均非空时,分别对它们进行上述的划分过程,直至所有无序子区中的数据元素均已排序为止。
4.2. 排序过程:
【示例】:
初始关键字 [49 38 65 97 76 13 27 49]
第一次交换后 [27 38 65 97 76 13 49 49]
第二次交换后 [27 38 49 97 76 13 65 49]
第三次交换后 [27 38 13 97 76 49 65 49]
第四次交换后 [27 38 13 49 76 97 65 49]
[27 38 13 49 76 97 65 49]
(一次划分过程)
初始关键字 [49 38 65 97 76 13 27 49]
一趟排序之后 [27 38 13] 49 [76 97 65 49]
二趟排序之后 [13] 27 [38] 49 [49 65]76 [97]
三趟排序之后 13 27 38 49 49 [65]76 97
最后的排序结果 13 27 38 49 49 65 76 97
各趟排序之后的状态
4.3. 程序实现
4.1. 基本思想:
在当前无序区R[1..H]中任取一个数据元素作为比较的"基准"(不妨记为X),用此基准将当前无序区划分为左右两个较小的无序区:R[1..I-1]和R[I+1..H],且左边的无序子区中数据元素均小于等于基准元素,右边的无序子区中数据元素均大于等于基准元素,而基准X则位于最终排序的位置上,即R[1..I-1]≤X.Key≤R[I+1..H](1≤I≤H),当R[1..I-1]和R[I+1..H]均非空时,分别对它们进行上述的划分过程,直至所有无序子区中的数据元素均已排序为止。
4.2. 排序过程:
【示例】:
初始关键字 [49 38 65 97 76 13 27 49]
第一次交换后 [27 38 65 97 76 13 49 49]
第二次交换后 [27 38 49 97 76 13 65 49]
第三次交换后 [27 38 13 97 76 49 65 49]
第四次交换后 [27 38 13 49 76 97 65 49]
[27 38 13 49 76 97 65 49]
(一次划分过程)
初始关键字 [49 38 65 97 76 13 27 49]
一趟排序之后 [27 38 13] 49 [76 97 65 49]
二趟排序之后 [13] 27 [38] 49 [49 65]76 [97]
三趟排序之后 13 27 38 49 49 [65]76 97
最后的排序结果 13 27 38 49 49 65 76 97
各趟排序之后的状态
4.3. 程序实现
| /// <summary> /// 快速排序法 /// </summary> /// <param name="dbArray"></param> /// <param name="StartIndex"></param> /// <param name="EndIndex"></param> private static void QuickSort( ref double[] dbArray ,int StartIndex ,int EndIndex) { //基数 int CurrentIndex = StartIndex ; //顺序查找 bool IsOrderSearched = true ; //反序查找 bool IsDisOrderSearched = true ; while(IsOrderSearched || IsDisOrderSearched) { IsDisOrderSearched = false ; IsOrderSearched = false ; for(int i =EndIndex ; i>CurrentIndex ;i--) { if(dbArray[i] < dbArray[CurrentIndex]) { ExChangeValue(ref dbArray[i] ,ref dbArray[CurrentIndex]); CurrentIndex = i ; IsDisOrderSearched = true ; break ; } } for(int i = StartIndex ; i < CurrentIndex ; i++) { if(dbArray[i] > dbArray[CurrentIndex]) { ExChangeValue(ref dbArray[i] ,ref dbArray[CurrentIndex]); CurrentIndex = i ; IsOrderSearched = true ; break ; } } } if( EndIndex - StartIndex > 0 ) { if(CurrentIndex != StartIndex ) { QuickSort(ref dbArray ,StartIndex,CurrentIndex -1); } if(CurrentIndex != EndIndex) { QuickSort(ref dbArray ,CurrentIndex+1,EndIndex); } } } /// 交换数据 /// </summary> /// <param name="A"></param> /// <param name="B"></param> private static void ExChangeValue(ref double A , ref double B) { double Temp = A ; A = B ; B = Temp ; } |
- 推荐阅讯
- 用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攻击防范与解决方案 路由故障处理手册
