快速排序的那些事儿(Kotlin)
作者:互联网
废话不说,直接上代码。
private fun quickSort(nums: IntArray, lo: Int, ho: Int): IntArray {
if(lo >= ho) {
return nums
}
var left = lo
var right = ho
val base = nums[left]
while (left < right) {
//base是左侧第一个,必须右侧优先。不断向前寻找小于base的数
while(nums[right] >= base && right > left) {
right--
}
//不断向后寻找大于base的数
while(nums[left] <= base && left < right) {
left++
}
//当双指针的顺序不变时,兑换左右指针下的数字。
if(right > left) {
val temp = nums[left]
nums[left] = nums[right]
nums[right] = temp
}
}
//循环完成后,兑换当前双指针指向的位置和base所在位置的数字
nums[lo] = nums[left]
nums[left] = base
//此时,num[left]/num[right]所指的位置,左侧都是比base小的数字,右侧都是比base大的数字。
//进行左右二分递归,继续执行以上步骤。
quickSort(nums, lo, left - 1)
quickSort(nums, left + 1, ho)
return nums
}
注意的要点:
1,当base(基准值)为左侧第一个时,必须要优先从右侧开始与base进行比较。可以想象一下,有一个这样的数组.
[-5, 0, 1, 10, 2, 7, 4]
base = -5,若从左侧开始,那么left指针就会优先向后移动一位,最终在循环完成后,进行base位置和双指针位置数字交换的时候,指针下标会比正确的下标多一位。
如果base在中间某一个位置,不需要注意这个问题。
标签:right,nums,Kotlin,base,ho,lo,排序,事儿,left 来源: https://blog.csdn.net/mortal_li/article/details/122581672