【数据结构】排序2 交换排序
交换排序就是基于比较交换的排序。
主要讲两种交换排序算法:冒泡排序和快速排序。
冒泡排序比较简单一般不会单独考察,重点考察的是快速排序的内容。
1.冒泡排序
基本算法思想:
对于每趟排序,从后往前两两比较,如果为逆序则进行交换,这样很显然不能一趟就得到正确的序列,但是每次都会把最小的元素移到序列的第一个位置,也就是每趟使一个元素移动到合适的位置上。
当进行下一趟排序时,前面那些已经就位的元素就不必参与。
经过这些过程,最多做n-1趟冒泡就能完成排序过程。
这里有一个问题,在比较好的情况中,可能发生的情况是经过少于n-1的比较就已经完成排序。(比如如果只有一个需要交换的位置,比如 2 1 3 4 5 6,则只需要进行一趟交换就完成了排序。)
关于这个问题只需要检测一趟比较中是否有交换进行,如果本趟比较没有进行交换,则代表序列已经是有序的,直接结束算法即可。
代码实现:

每趟中如何进行比较?
取决于每趟排序的处理方式不同,算法的实现方式也不一样。
但是只要记住:如果需要从小到大排序的话,就在出现A[i-1]>A[i]时交换;如果需要从大到小,则在A[i-1]<A[i]时交换。
以从小到大排序为例:如果每趟从前到后进行,则排好序的序列会从后向前,也就是每次使一个最大的元素堆积在尾部。如果每趟从后往前进行,则每次使一个最小的元素堆积在头部。
示例:

性能分析:

2.快速排序
快速排序是一种通过比较来进行的分治算法,并且可以用递归来实现它。
算法基本思想:

每次使一个元素位于正确位置上。最坏情况下经过n趟即可完成排序。
实现过程:


代码解释:

性能分析:

1.空间复杂度:递归过程需要用到栈,所以平均情况下空间复杂度为O(log2n)
2.时间复杂度
快速排序的时间复杂度与划分的对称程度有关,在最坏情况下即每次都将其中一个子序列划分为0时,时间复杂度为O(n^2),但这种最坏情况出现的几率也十分小。
一般情况下的时间复杂度都接近于最好情况下的时间复杂度,也就是O(nlog2n)
快速排序是平均性能最优的一种内部排序算法。
以及提高算法的枢轴选取策略:
想办法选取一个能使数据中分的枢轴
随机从序列中选取元素作为枢轴
3.稳定性:快速排序是不稳定的排序算法。
4.适用性:只适用于线性存储,因为需要支持随机存取。

浙公网安备 33010602011771号