【说明】博客内容选自课件内容和邓俊辉老师《数据结构下》课件
一、起泡排序
注意:1. 一般情况下,第一次“起泡”需要进行 n-1 次比较(交换),经过一趟“起泡”后,下一次‘起泡’的比较(交换)次数应该减少一次。但并不是每趟都如此。
2. 起泡排序的结束条件为,最后一趟没有进行“交换记录”
二、一趟快速排序
基本思想:按数据块进行交换,一次交换多个数据。
方法:找一个记录,以它的关键字作为“枢轴”,凡关键字小于枢轴的记录均移动至该记录之前,
反之,凡关键字大于枢轴的记录均移动至该记录之后。
一趟排序之后,无序序列R[s..t]将分割成两部分:R[s..i-1]和R[i+1..t]
且,R[j].key ≤ R[i].key ≤ R[j].key (s≤j≤i-1) 枢轴 (i+1≤j≤t)
实际上没有必要在比较过程中移动枢轴关键字;可以用R[0]存储枢轴的关键字,并每次与R[0]进行比较,最后R[0]赋值到R[low]中;
三、快速排序
首先对无序的记录序列进行“一次划分”,之后分别对分割所得两个子序列“递归”进行快速排序。
四、快速排序的时间分析
1.时间复杂度:快速排序的时间复杂度为O( nlogn)。是所有同数量级的此类排序方法中最快的一种。
最坏情况:若待排记录的初始状态为按关键字有序时,快速排序将蜕化为起泡排序,其时间复杂度为O(n2)。
为避免出现这种情况,需在进行一次划分之前,进行“预处理”,
即:先对 R(s).key, R⌊(s+t)/2⌋.key和R(t).key进行相互比较,然后取关键字为 “三者的中间值”的记录为枢轴记录。
2。空间复杂度
递归过程中需要用到栈。
如果每一趟都将记录均匀地划分为两个子序列,则栈的最大深度为 ⌊log n⌋ +1。最坏情况:栈的深度为 n-1。
3。稳定性?
不稳定!