内部排序之快速排序(交换类)

【说明】博客内容选自课件内容和邓俊辉老师《数据结构下》课件

一、起泡排序

注意: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.keyR(t).key进行相互比较,然后取关键字为 “三者的中间值”的记录为枢轴记录。

 2。空间复杂度

 递归过程中需要用到栈。

如果每一趟都将记录均匀地划分为两个子序列,则栈的最大深度为 log n1。最坏情况:栈的深度为 n-1

3。稳定性?

不稳定!

猜你喜欢

转载自blog.csdn.net/liuxiang15/article/details/82783302