【排序算法】冒泡排序、简单选择排序、直接插入排序比较和分析
写在前面:
本文简单介绍了冒泡排序、简单选择排序、直接插入排序,并对这三种排序进行比较,入参都是80000个随机数,比较算法耗时。进一步,我们通过代码分析三种排序算法的性能。
活动地址:CSDN21天学习挑战赛
本文关键字:排序算法、冒泡排序、简单选择排序、直接插入排序、比较和分析、C#
文章目录
一、排序算法分类
-
内部排序
指将需要处理的所有数据都加载到内部存储器(内存)中进行排序。
-
外部排序
数据量过大,无法全部加载到内存中,需要借助外部存储(文件等)进行排序。
-
常见的分类方法
二、算法效率
1. 时间复杂度
度量一个程序(算法)执行时间的两种方法。
-
事后统计的方法
这种方法可行,但有两个问题:一是要想对设计的算法的运行性能进行评测,需要事件运行该程序;二是所得时间的统计量依赖于计算机的硬件、软件等环境因素。
-
事前估算的方法
通过分析某个算法的时间复杂度来判断哪个算法更优。
-
时间频度
一个算法花费的时间与算法中语句的执行次数成正比。一个算法中的语句执行次数称为语句频度或者时间频度。记为T(n)。
此处引用清华大学《数据结构》课程的一段话,一般情况下,算法中的基本操作语句的重复执行次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n) / f(n) 的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作 T(n)=O( f(n) ),称O( f(n) ) 为算法的渐进时间复杂度,简称时间复杂度。
2. 空间复杂度
空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度。有的算法需要占用的临时工作单元数与解决问题的规模n有关,它随着n的增大而增大,当n较大时,将占用较多的存储单元。
三、经典排序算法
1. 简单选择排序
也称直接选择排序 Select Sorting,整个过程就是每一趟都将无序区中的所有元素进行逐一比较,找到最小的元素,与无序区中的首个元素进行交换,有序区长度加1,无序区长度减1。重复以上步骤,直到所有的元素均已排好。
文章传送门:图解简单选择排序(图解堪比Debug显示每次循环结果)
2. 冒泡排序
冒泡排序的英文Bubble Sort,是一种最基础的交换排序。之所以叫做冒泡排序,因为每一个元素都可以像小气泡一样,根据自身大小一点一点向数组的一侧移动。
文章传送门:图解冒泡排序(多图+解决两种无效比较问题)
3. 直接插入排序
直接插入排序Insertion Sorting是一种最简单的排序方法,过程就是将每个待排元素逐个插入到已经排好的有序序列中。
文章传送门:图解直接插入排序(图解堪比Debug显示每次循环结果)
四、比较与分析
简单选择排序、冒泡排序、直接插入排序的具体内容请至上述三篇博文查看,这里就不展开讲。
本文中的代码分别来自上述三篇博文,并将打印的代码注释(打印会非常影响耗时)。
注意:我们将创建一个随机数组(长度分别为8、800、8000、80000),分别调用三种不同的算法3次,计算耗时。
1. 算法实现
/// <summary>
/// 简单选择排序静态类
/// </summary>
public static class SelectSort