教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 小学教育 >

四种简单的排序算法C++

来源:网络收集 时间:2026-08-26
导读: 四种简单的排序算法 我觉得如果想成为一名优秀的开发者,不仅要积极学习时下流行的新技术,比如WCF、 MVC、AJAX等,熟练应用一些已经比较成熟的技术,比如、WinForm。还应该有着牢固的计算机基础知识,比如数据结构、操作系统、编译原理、网络与数据通信等。

四种简单的排序算法

我觉得如果想成为一名优秀的开发者,不仅要积极学习时下流行的新技术,比如WCF、 MVC、AJAX等,熟练应用一些已经比较成熟的技术,比如、WinForm。还应该有着牢固的计算机基础知识,比如数据结构、操作系统、编译原理、网络与数据通信等。有的朋友可能觉得这方面的东西过于艰深和理论化,望而却步,但我觉得假日里花上一个下午的时间,研究一种算法或者一种数据结构,然后写写心得,难道不是一件乐事么?所以,我打算将一些常见的数据结构和算法总结一下,不一定要集中一段时间花费很大精力,只是在比较空闲的时间用一种很放松的心态去完成。我最不愿意的,就是将写博客或者是学习技术变为一项工作或者负担,应该将它们视为生活中的一种消遣。人们总是说坚持不易,实际上当你提到“坚持”两个字之时,说明你已经将这件事视为了一种痛苦,你的内心深处并不愿意做这件事,所以才需要坚持。你从不曾听人说“我坚持玩了十年的电子游戏”,或者“坚持看了十年动漫、电影”、“坚持和心爱的女友相处了十年”吧?我从来不曾坚持,因为我将其视为一个爱好和消遣,就像许多人玩网络游戏一样。

好了,闲话就说这么多吧,我们回到正题。因为这方面的著作很多,所以这里只给出简单的描述和实现,供我本人及感兴趣的朋友参考。我会尽量用C#和C++两种语言实现,对于一些不好用C#表达的结构,仅用C++实现。

本文将描述四种最简单的排序方法,插入排序、泡沫排序、选择排序、希尔排序,我在这里将其称为“简单排序”,是因为它们相对于快速排序、归并排序、堆排序、分配排序、基数排序从理解和算法上要简单一些。对于后面这几种排序,我将其称为“高级排序”。 简单排序

开始之前先声明一个约定,对于数组中保存的数据,统一称为记录,以避免和“元素”,“对象”等名称相混淆。对于一个记录,用于排序的码,称为关键码。很显然,关键码的选择与数组中记录的类型密切相关,如果记录为int值,则关键码就是本身;如果记录是自定义对象,它很可能包含了多个字段,那么选定这些字段之一为关键码。凡是有关排序和查找的算法,就会关系到两个记录比较大小,而如何决定两个对象的大小,应该由算法程序的客户端(客户对象)决定。对于.NET来说,我们可以创建一个实现了IComparer<T>的类(对于C++也是类似)。关于IComparer<T>的更多信息,可以参考这篇文章《基于业务对象的排序》。最后,为了使程序简单,对于数组为空的情况我并没有做处理。

1.插入排序

算法思想

插入排序使用了两层嵌套循环,逐个处理待排序的记录。每个记录与前面已经排好序的记录序列进行比较,并将其插入到合适的位置。假设数组长度为n,外层循环控制变量i由1至n-1依次递进,用于选择当前处理哪条记录;里层循环控制变量j,初始值为i,并由

i至1递减,与上一记录进行对比,决定将该元素插入到哪一个位置。这里的关键思想是,当处理第i条记录时,前面i-1条记录已经是有序的了。需要注意的是,因为是将当前记录与相邻的上一记录相比较,所以循环控制变量的起始值为1(数组下标),如果为0的话,上一记录为-1,则数组越界。

现在我们考察一下第i条记录的处理情况:假设外层循环递进到第i条记录,设其关键码的值为X,那么此时有可能有两种情况:

1. 如果上一记录比X大,那么就交换它们,直到上一记录的关键码比X小或者相等

为止。

2. 如果上一记录比X小或者相等,那么之前的所有记录一定是有序的,且都比X小,

此时退出里层循环。外层循环向前递进,处理下一条记录。

算法实现(C#) public class SortAlgorithm {

// 插入排序

public static void InsertSort<T, C>(T[] array, C comparer) where C:IComparer<T>

{

for (int i = 1; i <= array.Length - 1; i++) {

//Console.Write("{0}: ", i);

int j = i;

while (j>=1 && pare(array[j], array[j - 1]) < 0) {

swap(ref array[j], ref array[j-1]);

j--;

}

//Console.WriteLine();

//AlgorithmHelper.PrintArray(array);

}

}

// 交换数组array中第i个元素和第j个元素

private static void swap<T>(ref T x,ref T y) {

// Console.Write("{0}<-->{1} ", x, y);

T temp = x;

x = y;

y = temp;

}

}

上面Console.WriteLine()方法和AlgorithmHelper.PrintArray()方法仅仅是出于测试方便,PrintArray()方法依次打印了数组的内容。swap<T>()方法则用于交换数组中的两条记录,

也对交换数进行了打印(这里我注释掉了,但在测试时可以取消对它们的注释)。外层for循环控制变量i表示当前处理第i条记录。 public class AlgorithmHelper {

// 打印数组内容

public static void PrintArray<T>(T[] array) {

Console.Write(" Array:");

foreach (T item in array) {

Console.Write(" {0}", item);

}

Console.WriteLine();

}

}

// 获得Comparer,进行比较

public class ComparerFactory {

public static IComparer<int> GetIntComparer() {

return new IntComparer();

}

public class IntComparer : IComparer<int> {

public int Compare(int x, int y) {

return pareTo(y);

}

}

}

上面这段代码我们创建了一个ComparerFactory类,它用于获得一个IntComparer对象,这个对象实现了IComparer<T>接口,规定了两个int类型的关键码之间比较大小的规则。如果你有自定义的类型,比如叫MyType,只需要在ComparerFactory中再添加一个类,比如叫MyTypeComparer,然后让这个类也实现IComparer<T>接口,最后再添加一个方法返回MyTypeComparer就可以了。

输出演示(C#)

接下来我们看一下客户端代码和输出:

static void Main(string[] args) {

int[] array = {42,20,17,13,28,14,23,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 x<y;

}

static bool Equal(int x, int y){

return x==y;

}

static bool Larger(int x, int y){

return x>y;

}

};

// 插入排序

template <class T, class C>

void InsertSort(T a[], int length){

for(int i=1;i<=length-1;i++){

int j = i;

while(j>=1 && C::Smaller(a[j], a[j-1])){

swap(a[j], a[j-1]);

j--;

}

}

}

2.冒泡排序

算法思想

如果你从没有学习过有关算法方面的知识,而需要设计一个数组排序的算法,那么很有可能设计出的就是泡沫排序算法了 …… 此处隐藏:3255字,全部文档内容请下载后查看。喜欢就下载吧 ……

四种简单的排序算法C++.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/42236.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)