其他分享
首页 > 其他分享> > 快速排序的那些事儿(Kotlin)

快速排序的那些事儿(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