排序:排序就是重新排列表中元素,使表中元素满足关键字有序的过程。
排序分为两大模块
一: 外部排序
二:内部排序(重点)
注解:
1.排序算法的评价指标:1.时间复杂度 2.空间复杂度
2.排序算法的稳定性:若待排表中两个元素Ri和Rj对应的关键字相同,且Ri在Rj前。若使用某一算法进行排序后,Ri和Rj相对位置不变则称这个排序算法是稳定的。否则排序算法不稳定。
1.插入排序:每次将一个待排记录按关键字大小插入到前面已排好的序列中,直到全部记录插入完成。(算法稳定)
由直接插入排序引出三种重要的算法:1.直接插入排序 2.折半插入排序 3.希尔排序
1.直接插入排序:
空间复杂度O(1)(主要定义几个变量来进行对比和交换)
时间复杂度:主要开销来自于关键字对比以及移动元素的过程。若有n个元素需要n-1趟处理(可理解为每一趟插入一个元素,第一个元素默认在队列头部,故剩余元素n-1,故需要n-1趟处理)。
最好情况:对比n-1次关键字,不需要移动元素(此时表中有序排序)此时为最好时间复杂度
O(n)
最坏情况:原表逆序排序,每次都需要从尾部对比元素,并且移动元素,直至到头元素为止。此时时间复杂度为:O(n^2)(对比次数从1一直加到n-1等差数列求和可得)。
平均时间复杂度:O(n^2)
是否稳定:显然根据直接插入排序的算法原理是稳定的。
2.折半插入排序:
在前面已有序的子表中用折半查找找到需要插入的位置,再移动元素。
比起直接插入排序比较次数变少了,但移动元素次数仍旧没变,平均时间复杂度整体来看依旧是
O(n^2)。
上述两种算法可以链表结构实现:用链表虽然移动元素的次数变少了,但是比较次数的平均时间复杂度依旧是O(n^2)。
3.希尔排序:
追求表中元素部分有序直到全局有序。最好情况下原本就有序,比较好情况下基本有序。
算法思想:将待排序表以d为单位增量进行分割成若干子表。对各个子表分别进行直接插入排序。缩小增量d,直至d=1为止。
空间复杂度:O(1),主要是定义变量之间的比较与交换
时间复杂度:暂时无法用数学证明其具体时间复杂度。
稳定性:不稳定。