排序算法源码
排序算法是《数据结构与算法》中最基本的算法之一。
对于排序算法,不能简单的就学习其代码实现而是要学习如何去分析算法,了解每一个算法的时间复杂度,空间复杂度等特征。
排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因为排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括:
下面以正序排列为例,介绍各个算法的实现原理
Note:
在第二步交换元素这一步骤中就决定了该排序算法是不稳定的排序算法
归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:
和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是 O(nlogn) 的时间复杂度。代价是需要额外的内存空间。
在这里只介绍归并算法的递归实现
申请空间,使其大小为两个已经排序序列之和**,该空间用来存放合并后的序列
设定两个指针,最初位置分别为两个已排序序列的起始位置
比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针到达序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
Note:
需要申请额外的空间来存放合并后的序列
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。当子数列只有一个元素时,退出该级函数,返回上一级函数