递归的精髓在于放弃!放弃你对于理解和跟踪递归全程的企图,只理解递归两层之间的交接,以及递归终结的条件。
快速排序和冒泡排序一样,也属于交换排序.和冒泡排序不同的是,快速排序在每一轮选中1个基准元素,并让其它比它大的元素移动到一边,比它小的移动到另一边,从而把数列拆解成两个部分.这种思路叫作 分治法.
通过以上描述,快速排序实现分成2步:
-
获取基准元素
-
元素的交换
基准元素的选择
毫无疑问,最简单的方式就是选择数列的第1个元素作为基准元素.
元素的交换
元素的交换实现有两种方式: 单边循环法和 双边循环法.先记录单边循环法的思路.
举个例子,将一下数组,从小到大进行升序排序:
一. 首先获取基准元素standardValue,同时设置一个mark指针指向数列起始位置,mark指针表示 小于基准元素的区域边界.用以上数组来说:
二. 然后,从基准元素的下一位(即7)开始遍历数组:
如果遍历到的元素大于基准元素,继续遍历;
如果遍历到的元素小于基准元素,需要完成:
-
将mark指针右移1位,因为小于基准元素的区域边界增大了1;
-
将最新遍历到的元素和mark指针指向的元素进行交换,因为最新遍历的元素属于小于基准元素standardValue的区域.
三. 最后,将基准元素和指针指向的元素交换,这一轮宣告结束,将看到的数组是这样:
实现了将数组中比基准元素4小的元素移动到了左边, 比基准元素4大的元素移动到了右边, 分成左右两个部分, 然后对左右两个部分继续一 二 三的步骤,也就是递归.
单边循环法的实现
下集预告
下篇记录一下快速排序的双边循环法.
作者:习惯沉淀,一直在路上的北漂码畜
Original: https://www.cnblogs.com/yadongliang/p/14953956.html
Author: 习惯沉淀
Title: 快速排序–单边循环法
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/554186/
转载文章受原作者版权保护。转载请注明原作者出处!