本文记录算法中入门级别的8种简单排序算法。
1.抽象公共接口部分
1 | interface ISortMethod |
2.建立公共基类进行数据有效性校验和控制台输出的颜色标记
1 | public class SortBaseClass : ISortMethod |
3.main函数具体打印代码
1 | static void Main(string[] args) |
4.具体算法实现部分
具体实现算法,同时添加过程打印以便分析。
一. 冒泡排序
1.1原理
冒泡排序 (Bubble Sort)算法的原理如下:
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
1.2具体代码实现
1 | public class BubbleSortMethod : SortBaseClass |
同时修改main函数的算法为具体的: ISortMethod sort = new BubbleSortMethod();
执行结果为:
二.选择排序
2.1原理
选择排序 (Selection sort)算法的原理如下:
每一次从待排序的数据元素 中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
2.2具体代码实现
1 | public class SelectionSortMethod : SortBaseClass |
同时修改main函数的算法为具体的: ISortMethod sort = new SelectionSortMethod();
执行结果为:
三. 插入排序
3.1原理
插入排序 (Insert Sort)算法的原理如下:
插入即表示将一个新的数据插入到一个有序数组中,并继续保持有序。例如有一个长度为N的无序数组,进行N-1次的插入即能完成排序。
第一次,数组第1个数认为是有序的数组,将数组第二个元素插入仅有1个有序的数组中;
第二次,数组前两个元素组成有序的数组,将数组第三个元素插入由两个元素构成的有序数组中…..
第N-1次,数组前N-1个元素组成有序的数组,将数组的第N个元素插入由N-1个元素构成的有序数组中,则完成了整个插入排序。
….
按序比较直到集合排序完毕。
3.2具体代码实现
1 | public class NormalInsertSortMethod : SortBaseClass |
同时修改main函数的算法为具体的: ISortMethod sort = new NormalInsertSortMethod();
执行结果为:
四. 堆排序
4.1原理
堆排序 (Heap Sort)算法的原理如下:
利用二叉树的特性,将剩余数组中的最大值(或最小值)排到开头处。然后去掉该值(提取到新数组开头数值)再次排序得到最值排去新数组那边开头,依次重复操作就能得到结果。
这里用到的 二叉树的特性 是节点i的左子节点为2i,右子节点为2i+1.
结合集合的话-1。集合(n = i-1)(i>0,集合第一个序号为0,故需要-1),序号(n)的左子节点为序号(2n+1),右子节点为序号(2n+2)。
int child = 2 * parentid + 1;就是这里的特性使用。
引用 链接 中这个图比较直观。
在下面的代码中是这样的:
4.2具体代码实现
1 | public class HeapSortMethod : SortBaseClass |
同时修改main函数的算法为具体的: ISortMethod sort = new HeapSortMethod();
执行结果为:
五. 归并排序
5.1原理
归并排序 (Merge Sort)算法的原理如下:
假设序列共有n个元素,将序列每相邻两个数字进行归并操作(merge),形成floor(n/2)个序列,排序后每个序列包含两个元素。将上述序列再次归并,形成floor(n/4)个序列,每个序列包含四个元素…重复归并,直到所有元素排序完毕。
引用 链接 中这个图比较直观。
5.2具体代码实现
1 | public class MergeSortMethod : SortBaseClass |
同时修改main函数的算法为具体的: ISortMethod sort = new MergeSortMethod();
执行结果为:
六. 快速排序
6.1原理
快速排序 (Quick Sort)算法的原理如下:
假设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面:
- 设置两个变量i、j,排序开始的时候:i=0,j=N-1;
- 以第一个数组元素作为关键数据,赋值给key,即key=A[0];
- 从j开始向前搜索,即由后开始向前搜索(j–),找到第一个小于key的值A[j],将A[j]和A[i]互换;
- 从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
- 重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。
引用 链接 中这个图比较直观。
6.2具体代码实现
1 | public class QuickSortMethod : SortBaseClass |
同时修改main函数的算法为具体的: ISortMethod sort = new QuickSortMethod();
执行结果为:
七. 希尔排序
7.1原理
希尔排序 (Shell’s Sort)算法是直接插入排序算法的一种更高效的改进版本:
假设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面:
先取一个小于n的整数增量(一般取n/2)d1,把数组中下标间隔d1的作为一组进行组内排序;然后取第二个增量d2(d1/2)重复操作,直到增量 = 1。
引用 链接 中这个图比较直观。
7.2具体代码实现
1 | public class ShellsSortMethod : SortBaseClass |
同时修改main函数的算法为具体的: ISortMethod sort = new ShellsSortMethod();
执行结果为:
八. 基数排序
8.1原理
基数排序 (Radix Sort)算法的原理如下:
基数排序是一种借助多关键字排序的思想对单逻辑关键字进行排序的方法。它是一种稳定的排序算法。多关键字排序中有两种方法:最高位优先法(MSD)和最低位优先法(LSD)。通常用于对数的排序选择的是最低位优先法,即先对最次位关键字进行排序,再对高一位的关键字进行排序,以此类推。
引用 链接 中这个图比较直观。
8.2具体代码实现
1 | public class RadixSortMethod : SortBaseClass |
同时修改main函数的算法为具体的: ISortMethod sort = new RadixSortMethod();
执行结果为:
该算法以空间换时间,不用进行数学上的比较就能进行排序。与前面几种算法有一定的区别。
本文测试程序工程可以从git直接获取:
git代码库: Codes