ImageVerifierCode 换一换
格式:DOCX , 页数:11 ,大小:59.15KB ,
资源ID:2844017      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/2844017.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(四种简单的排序算法.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

四种简单的排序算法.docx

1、四种简单的排序算法四种简单的排序算法我觉得如果想成为一名优秀的开发者,不仅要积极学习时下流行的新技术,比如WCF、Asp.Net MVC、AJAX等,熟练应用一些已经比较成熟的技术,比如Asp.Net、WinForm。还应该有着牢固的计算机基础知识,比如数据结构、操作系统、编译原理、网络与数据通信等。有的朋友可能觉得这方面的东西过于艰深和理论化,望而却步,但我觉得假日里花上一个下午的时间,研究一种算法或者一种数据结构,然后写写心得,难道不是一件乐事么?所以,我打算将一些常见的数据结构和算法总结一下,不一定要集中一段时间花费很大精力,只是在比较空闲的时间用一种很放松的心态去完成。我最不愿意的,就

2、是将写博客或者是学习技术变为一项工作或者负担,应该将它们视为生活中的一种消遣。人们总是说坚持不易,实际上当你提到“坚持”两个字之时,说明你已经将这件事视为了一种痛苦,你的内心深处并不愿意做这件事,所以才需要坚持。你从不曾听人说“我坚持玩了十年的电子游戏”,或者“坚持看了十年动漫、电影”、“坚持和心爱的女友相处了十年”吧?我从来不曾坚持,因为我将其视为一个爱好和消遣,就像许多人玩网络游戏一样。好了,闲话就说这么多吧,我们回到正题。因为这方面的著作很多,所以这里只给出简单的描述和实现,供我本人及感兴趣的朋友参考。我会尽量用C#和C+两种语言实现,对于一些不好用C#表达的结构,仅用C+实现。本文将描

3、述四种最简单的排序方法,插入排序、泡沫排序、选择排序、希尔排序,我在这里将其称为“简单排序”,是因为它们相对于快速排序、归并排序、堆排序、分配排序、基数排序从理解和算法上要简单一些。对于后面这几种排序,我将其称为“高级排序”。简单排序开始之前先声明一个约定,对于数组中保存的数据,统一称为记录,以避免和“元素”,“对象”等名称相混淆。对于一个记录,用于排序的码,称为关键码。很显然,关键码的选择与数组中记录的类型密切相关,如果记录为int值,则关键码就是本身;如果记录是自定义对象,它很可能包含了多个字段,那么选定这些字段之一为关键码。凡是有关排序和查找的算法,就会关系到两个记录比较大小,而如何决定

4、两个对象的大小,应该由算法程序的客户端(客户对象)决定。对于.NET来说,我们可以创建一个实现了IComparer的类(对于C+也是类似)。关于IComparer的更多信息,可以参考这篇文章基于业务对象的排序。最后,为了使程序简单,对于数组为空的情况我并没有做处理。1.插入排序算法思想插入排序使用了两层嵌套循环,逐个处理待排序的记录。每个记录与前面已经排好序的记录序列进行比较,并将其插入到合适的位置。假设数组长度为n,外层循环控制变量i由1至n-1依次递进,用于选择当前处理哪条记录;里层循环控制变量j,初始值为i,并由i至1递减,与上一记录进行对比,决定将该元素插入到哪一个位置。这里的关键思想

5、是,当处理第i条记录时,前面i-1条记录已经是有序的了。需要注意的是,因为是将当前记录与相邻的上一记录相比较,所以循环控制变量的起始值为1(数组下标),如果为0的话,上一记录为-1,则数组越界。现在我们考察一下第i条记录的处理情况:假设外层循环递进到第i条记录,设其关键码的值为X,那么此时有可能有两种情况:1. 如果上一记录比X大,那么就交换它们,直到上一记录的关键码比X小或者相等为止。2. 如果上一记录比X小或者相等,那么之前的所有记录一定是有序的,且都比X小,此时退出里层循环。外层循环向前递进,处理下一条记录。算法实现(C#)public class SortAlgorithm / 插入排

6、序 public static void InsertSort(T array, C comparer) where C:IComparer for (int i = 1; i =1 & comparer.Compare(arrayj, arrayj - 1) 0) swap(ref arrayj, ref arrayj-1); j-; /Console.WriteLine(); /AlgorithmHelper.PrintArray(array); / 交换数组array中第i个元素和第j个元素 private static void swap(ref T x,ref T y) / Cons

7、ole.Write(01 , x, y); T temp = x; x = y; y = temp; 上面Console.WriteLine()方法和AlgorithmHelper.PrintArray()方法仅仅是出于测试方便,PrintArray()方法依次打印了数组的内容。swap()方法则用于交换数组中的两条记录,也对交换数进行了打印(这里我注释掉了,但在测试时可以取消对它们的注释)。外层for循环控制变量i表示当前处理第i条记录。public class AlgorithmHelper / 打印数组内容 public static void PrintArray(T array) C

8、onsole.Write( Array:); foreach (T item in array) Console.Write( 0, item); Console.WriteLine(); / 获得Comparer,进行比较public class ComparerFactory public static IComparer GetIntComparer() return new IntComparer(); public class IntComparer : IComparer public int Compare(int x, int y) return x.CompareTo(y);

9、 上面这段代码我们创建了一个ComparerFactory类,它用于获得一个IntComparer对象,这个对象实现了IComparer接口,规定了两个int类型的关键码之间比较大小的规则。如果你有自定义的类型,比如叫MyType,只需要在ComparerFactory中再添加一个类,比如叫MyTypeComparer,然后让这个类也实现IComparer接口,最后再添加一个方法返回MyTypeComparer就可以了。输出演示(C#)接下来我们看一下客户端代码和输出:static void Main(string args) int array = 42,20,17,13,28,14,23,

10、15; /int array = 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 ; AlgorithmHelper.PrintArray(array); SortAlgorithm.InsertSort (array, ComparerFactory.GetIntComparer();算法实现(C+)/ 对int类型进行排序class IntComparer public: static bool Smaller(int x, int y) return xy; ;/ 插入排序template void InsertSort(T a, int length) for(int i=1

11、;i=1 & C:Smaller(aj, aj-1) swap(aj, aj-1); j-; 2.冒泡排序算法思想如果你从没有学习过有关算法方面的知识,而需要设计一个数组排序的算法,那么很有可能设计出的就是泡沫排序算法了。因为它很好理解,实现起来也很简单。它也含有两层循环,假设数组长度为n,外层循环控制变量i由0到n-2递增,这个外层循环并不是处理某个记录,只是控制比较的趟数,由0到n-2,一共比较n-1趟。为什么n个记录只需要比较n-1趟?我们可以先看下最简单的两个数排序:比如4和3,我们只要比较一趟,就可以得出3、4。对于更多的记录可以类推。数组记录的交换由里层循环来完成,控制变量j初始值

12、为n-1(数组下标),一直递减到1。数组记录从数组的末尾开始与相邻的上一个记录相比,如果上一记录比当前记录的关键码大,则进行交换,直到当前记录的下标为1为止(此时上一记录的下标为0)。整个过程就好像一个气泡从底部向上升,于是这个排序算法也就被命名为了冒泡排序。我们来对它进行一个考察,按照这种排序方式,在进行完第一趟循环之后,最小的一定位于数组最顶部(下标为0);第二趟循环之后,次小的记录位于数组第二(下标为1)的位置;依次类推,第n-1趟循环之后,第n-1小的记录位于数组第n-1(下标为n-2)的位置。此时无需再进行第n趟循环,因为最后一个已经位于数组末尾(下标为n-1)位置了。算法实现(C#)/ 泡沫排序public static void BubbleSort(T array, C comparer) where C : IComparer int length = array.Length; for (int i = 0; i = 1; j-) if (comparer.Compare(arrayj, arrayj - 1) 0) swap(ref arrayj, re

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1