kotlin测试常规冒泡排序

冒泡排序的原理是两两比较相邻记录的元素,反序则交换,本质上都是将一连串的元素按照一定的规则重新排列。
思考逻辑:
比较相邻的元素,如果前一个比后一个大,将它们进行交换。如果只有1个元素,那么集合不需要进行循环判断,如果只有2个元素,那么这个集合只需要进行一个循环;如果是3个元素,那么需要进行2次循环,所以外层的循环次数是size-1次。
1.第一趟循环的目的和过程:从第一个元素到最后一个元素进行相邻元素的两相比较,将值大的元素移动到右边,结束后,最大的元素将会移动到最右边。那么内层的循环次数=size-1
2.第二趟循环,因为最大的元素在第一次循环时已经处在正确的位置,此次循环不需要对它操作,此次循环的结果是将第二大的元素移动到倒数第二个位置,那么内层的循环次数=size-2。后面的循环以此类推


    //冒泡排序
    @Test
    fun bubbleSort() {
        var format = SimpleDateFormat("HH:mm:ss")

        var length = 100000
        var datas = mutableListOf<Int>()
        for (i in 0..length) {
            datas.add(i, length - i)
        }
        print("time:" + format.format(Date()))
//        print("\ndata:$datas")

        var temp: Int
        //外层的循环次数=size-1,因为只有2个或以上才有比较的意义       
        for (i in 0 until datas.size-1) {
            //从下标0开始与右边的元素进行比较,所以j到倒数第二个下标结束
            for (j in 0 until datas.size - i - 1) {
                //判断规则进行交换
                if (datas[j] > datas[j + 1]) {
                    temp = datas[j]
                    datas[j] = datas[j + 1]
                    datas[j + 1] = temp
                }
            }
        }
        print("\ntime:${format.format(Date())}")
//        print("\ndata:$datas")


//        length = 100000
//        time:10:15:45
//        time:10:16:45
    }

因为上面的原始数据是我们进行倒序的结果,所以每个值都需要进行重新排序。加入有一串元素在我们进行到一半的时候就已经得到了结果,那么后面的循环是无用的,浪费了内存。我们知道元素进行排序是在 if (datas[j] > datas[j + 1]) 语句进行判断,所以我们可以从这里入手

    //冒泡排序
    @Test
    fun bubbleSort() {
        var format = SimpleDateFormat("HH:mm:ss")

        var length = 100000
        var datas = mutableListOf<Int>()
        for (i in 0..length) {
            datas.add(i, length - i)
        }
        print("time:" + format.format(Date()))

        var haveSwap = false
        var temp: Int
        for (i in 0 until datas.size - 1) {
            for (j in 0 until datas.size - i - 1) {
                if (datas[j] > datas[j + 1]) {
                    temp = datas[j]
                    datas[j] = datas[j + 1]
                    datas[j + 1] = temp
                    haveSwap = true
                }
            }
            //如果haveSwap=false,表示一个内层循环下来,所有的元素都没有进行操作,即这就是我们最终需要的结果
            if (!haveSwap) {
                break
            }
        }
        print("\ntime:${format.format(Date())}")
//        print("\ndata:$datas")

    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值