
我们定义一个临时变量用来保存待排序部分最左边的位置的下标,再用一个临时变量保存待排序部分最右边的下标,最开始的时候我们的待排序部分就是一整个数组,我们会通过一轮快速排序将其分为两个待排序部分: 我们称之为: 左待排序部分和右待排序部分,对于左待排序部分我们要采取左递归的方式来进行排序,对右待排序部分我们要采取右递归的方式来排序,我们在第一轮排序的时候, 我们用一个l (left首字母)来记录最左边的下标,用一个r来记录最右边的下标, 最左边和最右边的下标还有每次待排序数据都是通过参数传递过来的 ( 但是我们其实只用传递一次,剩下的就交给递归调用即可 )
注意: 我们这里讲的快排算法中还要引用一个临时变量pivot ( prvot表示中轴的意思 ) 来记录中间位置的值,我们每次依据中间位置的值进行分割
当引入pivot变量之后会让我们对快速排序可以掌握的更加透彻
我们在开始第一轮选择排序的时候在外层while循环之中我们写一个内层while循环,循环用来实现如果满足 arr[l] < pivot的时候我们让l++ , 因为这个时候其实就是我们的左边的值要比我们的中轴值小, 这个时候l 就要右移,直到找到一个比中间值大的值或者找到中间值为止,然后就停下,对于右边也是一样的, 如果满足 arr[r] > pivot的时候我们就让r–
这个时候注意: 我们判断的是arr[l] < pivot的时候l++,而不是arr[l] <= pivot的时候l++,这个时候是因为什么?
我们在判断了 l发现 l小于 r之后就要进行元素的交换,而交换了元素之后我们也要进行一个判断,我们要判断如果 arr[l] == pivot,那么就让r–, 如果arr[r] == pivot,那么就让l ++
这个时候是为什么?
我们这里首先要知道 arr[l] == arr[r] == pivot的情况分为两种:
所以我们就要判断如果 arr[l] == pivot,那么就让r–, 如果arr[r] == pivot,那么就让l ++ , 这个时候为什么 arr[l] == pivot那么就让 r–,而不是让l++?