博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c#实现冒泡、快速、选择和插入排序算法
阅读量:6316 次
发布时间:2019-06-22

本文共 1541 字,大约阅读时间需要 5 分钟。

整理一下常用的排序算法,用c#实现,以备日后再用。Code is cheap.看具体实现吧。

1.冒泡排序
将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其向上"飘浮"(冒泡因此得名)。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。

ContractedBlock.gif
Code
冒泡算法小结:
 因为每一趟排序都使有序区增加了一个气泡,在经过n-1趟排序之后,有序区中就有n-1个气泡,而无序区中气泡的重量总是大于等于有序区中气泡的重量,所以整个冒泡排序过程至多需要进行n-1趟排序。若在某一趟排序中未发现气泡位置的交换,则说明待排序的无序区中所有气泡均满足轻者在上,重者在下的原则,因此,冒泡排序过程可在此趟排序后终止。为此,在下面给出的算法中,引入一个布尔量flag,在每趟排序开始前,先将其置为false,若排序过程中发生了交换,则将其置为true.各趟排序结束时检查flag,若未曾发生过交换则终止算法,不再进行下一趟排序。(不加flag也可以实现排序,但是会造成不必要的循环和比较)。
2.快速排序 ***
一、算法思想
     快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。
二、快速排序的基本思想
     设当前待排序的无序区为R[low..high],利用分治法可将快速排序的基本思想描述为:
(1)分解: 
     在R[low..high]中任选一个记录作为基准(Pivot),以此基准将当前无序区划分为左、右两个较小的子区间R[low..pivotpos-1)和R[pivotpos+1..high],并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记为pivot)的关键字pivot.key,右边的子区间中所有记录的关键字均大于等于pivot.key,而基准记录pivot则位于正确的位置(pivotpos)上,它无须参加后续的排序。
注意
:划分的关键是要求出基准记录所在的位置pivotpos。划分的结果可以简单地表示为(
注意 
pivot=R[pivotpos] ):  R[low..pivotpos-1].keys≤R[pivotpos].key≤R[pivotpos+1..high].keys,
其中low≤pivotpos≤high。(边界条件)
(2)求解: 
     通过递归调用快速排序对左、右子区间R[low..pivotpos-1]和R[pivotpos+1..high]快速排序。
(3)组合: 
     因为当"求解"步骤中的两个递归调用结束时,其左、右两个子区间已有序。对快速排序而言,"组合"步骤无须做什么,可看作是空操作。
ContractedBlock.gif
Code

 网上还有一种相似的代码,一起贴出来:

ContractedBlock.gif
Code

3.选择排序

ContractedBlock.gif
Code

4.插入排序

ContractedBlock.gif
Code

虽然在实际的项目中,我们的确很少用到这些或其他更高级的算法,但是”算法是程序的灵魂“。虽然算法确实很难,但是”当你用它们巧妙地解决问题的时候,那种纯粹的喜悦和快乐是任何不曾体验过的人所能感受到的“。很不幸,我还没有体验几次这样的快乐。

本文转自JeffWong博客园博客,原文链接:http://www.cnblogs.com/jeffwongishandsome/archive/2009/03/28/1423920.html,如需转载请自行联系原作者
你可能感兴趣的文章
BZOJ 1411&&Vijos 1544 : [ZJOI2009]硬币游戏【递推,快速幂】
查看>>
ECJTUACM16 Winter vacation training #1 题解&源码
查看>>
jsp中如何整合CKEditor+CKFinder实现文件上传
查看>>
前后台交互经常使用的技术汇总(后台:Java技术,前台:Js或者Jquery)
查看>>
【java规则引擎】之规则引擎解释
查看>>
Radware:金融机构如何应对日益猖獗的网络攻击
查看>>
Java中注释的使用是有原则的
查看>>
SanDisk研发32nm工艺最小尺寸NAND闪存
查看>>
阿里云推视频云解决方案 窄带高清省流量
查看>>
走进大数据之拓扑数据分析方法
查看>>
我是如何击败Java自带排序算法的
查看>>
Gartner::未来五年有颠覆性的IT技术都在这里
查看>>
开发一个Linux调试器(五):源码和信号
查看>>
Python中的垃圾回收机制
查看>>
企业大数据分析实践指南、总结与展望
查看>>
智能家庭本周锋闻:属于未来的Apple Watch
查看>>
警惕手机病毒成偷跑流量“陷阱”
查看>>
大数据挖掘技术之DM经典模型(上)
查看>>
《Cocos2D权威指南》——2.4 碰撞检测
查看>>
如何无痛集成超融合平台与现有硬件?
查看>>