ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

快速排序的那些事儿(Kotlin)

2022-01-19 15:32:29  阅读:186  来源: 互联网

标签:right nums Kotlin base ho lo 排序 事儿 left


废话不说,直接上代码。

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有