交换排序就是基于比较交换的排序。
主要讲两种交换排序算法:冒泡排序和快速排序。
冒泡排序比较简单一般不会单独考察,重点考察的是快速排序的内容。
1.冒泡排序
基本算法思想:
对于每趟排序,从后往前两两比较,如果为逆序则进行交换,这样很显然不能一趟就得到正确的序列,但是每次都会把最小的元素移到序列的第一个位置,也就是每趟使一个元素移动到合适的位置上。
当进行下一趟排序时,前面那些已经就位的元素就不必参与。
经过这些过程,最多做n-1趟冒泡就能完成排序过程。
这里有一个问题,在比较好的情况中,可能发生的情况是经过少于n-1的比较就已经完成排序。(比如如果只有一个需要交换的位置,比如 2 1 3 4 5 6,则只需要进行一趟交换就完成了排序。)
关于这个问题只需要检测一趟比较中是否有交换进行,如果本趟比较没有进行交换,则代表序列已经是有序的,直接结束算法即可。
代码实现:
每趟中如何进行比较?
取决于每趟排序的处理方式不同,算法的实现方式也不一样。
但是只要记住:如果需要从小到大排序的话,就在出现A[i-1]>A[i]时交换;如果需要从大到小,则在A[i-1]<A[i]时交换。
以从小到大排序为例:如果每趟从前到后进行,则排好序的序列会从后向前,也就是每次使一个最大的元素堆积在尾部。如果每趟从后往前进行,则每次使一个最小的元素堆积在头部。
示例:
性能分析:
2.快速排序
快速排序是一种通过比较来进行的分治算法,并且可以用递归来实现它。
算法基本思想:
每次使一个元素位于正确位置上。最坏情况下经过n趟即可完成排序。
实现过程: