我们都知道,程序=数据结构+算法。数据结构和算法是密切相关的,因为不同的数据结构配合不同的算法,会有不同的效率。排序是最常见的算法之一,功能顾名思义是将一个数据对象(即数据元素的集合)重新排列成遵循某种规则的序列。例如在构建二叉搜索树的过程中也有排序的过(插入节点过程中左子树小于其父节点,右子树大于其父结点 )程。排序是程序设计中的一种重要操作,因为对于无序的序列,进行查找操作时,我们只能用顺序查找的方法,这样平均查找长度为(n+1)/2,但是如果对有序的序列进行查找,我们可以用折半查找法,折半查找法的效率较高,平均查找长度为((n+1)/n)*log(2n+1)-1(当n很大时,可以近似看作log(2n+1)-1),时间复杂度也是O(logN),所以说,排序是很重要的一种操作。
那么什么是内部排序?内部排序指的是,待排序列能够一次全部导入到内存空间里,也就是说有足够大的内存可以一次存放所有的待排序列,然后排序的过程是可以在内存中一次完成的。
排序算法中有一个常用的概念是“稳定性”,排序算法的稳定性指的是,对于任意的两个或以上相等的数据,如果排序前后它们的相对位置不发生改变,那么我们就说这个排序算法是稳定的。假设我们要对一个学生信息数据库表做排序,表中有两个学生的名字一样都是A,我们把它编号A1和A2,如果排序前A1排在A2前面,排序后A1仍然排在A2的前面,那么就说这个排序算法是稳定的,否则说是不稳定的。
下面几篇日志中我都会分享对一些排序算法的理解和实现的代码。
首先来看插入排序法。直接插入排序的思路是这样的:把待排序列分成两部分,前半部分是已经排好的序列,后半部分是待排列序列。假设序列里有N个元素,一开始第一个元素当作已排好序列,然后从序列第二个元素开始,每次从后面部分待排序列中拿出一个元素例如Tmp,与前面的已排好序列元素从