一.八大排序算法分类
二.时间复杂度比较
三.稳定性分析
判断稳定性是在排序中有重复元素,在经过排序后,其前驱与后继的逻辑没有改变,则认为是稳定的,相反,则不稳定。
例如:a,z,c,d1,d2,b
假设上述为需要排序的数列,其中d1 = d2
排序后:a,b,c,d1,d2,z 则认为此排序是稳定的(d1,d2的前后逻辑没有改变)
排序后:a,b,c,d2,d1,z 相等的元素发生位置的移动,或者存在可能位置移动,则是不稳定的排序
四.时间与空间复杂度
时间复杂度:是在算法中用来定性描述运行时间的函数。用O表示,基本操作重复执行的次数是问题规模n的某个函数f(n),于是算法的时间量度可以记为:T(n) = O(f(n)),简称O(n)。
空间复杂度:指运行完一个程序所需内存的大小,其中n为问题的规模,用S(n)表示。
五.排序算法实现
5.1简单插入排序
简单插入排序:在排序时,首先认为第一个元素为有序数列,一次从第二个开始,将元素插入到有序数列中。当插完最后一个元素,整个数列将是有序数列。
例如:3,2,5,8,4
首先认为 3 是有序数列,从 2 开始,一次插入到有序数列中。
0 1 2 3 4
源数据: 3,2,5,8,4
第一次循环后:2,3,5,8,4 岗哨指向下标1,发现2比3小,需要交换,交换完岗哨后移,指下标2
第二次循环后:2,3,5,8,4 岗哨继续后移,指向下标3
第三次循环后:2,3,5,8,4 岗哨继续后移,指向下标4
第四次循环后:2,3,5,4,8 4需要交换,4与 8 交换
第五次循环后:2,3,4,5,8 4继续交换,直到不能交换为止。岗哨继续后移出界,结束。
C语言实现如下:
结果:
JAVA语言实现如下:
结果:
分析:简单插入排序属于稳定排序,当相同元素比较后,不会发生交换。平均时间复杂度为O(n2)。
5.2 希尔排序