冒泡排序

443 阅读1分钟

为kotlin代码

       /**
         * 冒泡排序
         */
        private fun bubbleSortV1(data: ArrayList<Int>) {
            for (i in 0 until data.size - 1) {
                for (j in 0 until data.size - 1 - i) {
                    if (data[j] > data[j + 1]) {
                        val temp = data[j]
                        data[j] = data[j + 1]
                        data[j + 1] = temp
                    }
                }
            }
        }

如果数据为:1,2,3,4,5,6,8,7 第一次排序后就已经可以了,不需要继续了,所以优化代码如下:

        /**
         * 冒泡排序优化版
         */
        private fun bubbleSortV2(data: ArrayList<Int>) {
            for (i in 0 until data.size - 1) {
                var isSorted = true
                for (j in 0 until data.size - 1 - i) {
                    if (data[j] > data[j + 1]) {
                        val temp = data[j]
                        data[j] = data[j + 1]
                        data[j + 1] = temp
                        //排序了
                        isSorted = false
                    }
                }
                if (isSorted) {
                    //没有执行到交换的一步,说明已经有序了,可以直接退出了
                    break
                }
            }
        }

若数据为23145678 则第一次排序后为21345678,然后最后一位,为不需要排序的数组,第二次排到7。(看for循环的条件可知) 但是其实45678都是有序的不需要比较的。所以继续优化

/**
         * 冒泡排序再优化
         */
        private fun bubbleSortV3(data: ArrayList<Int>) {

            for (i in 0 until data.size - 1) {
                var isSorted = true
                //比对到这里为止
                var sortedIndex=data.size - 1
                for (j in 0 until sortedIndex) {
                    if (data[j] > data[j + 1]) {
                        val temp = data[j]
                        data[j] = data[j + 1]
                        data[j + 1] = temp
                        //排序了
                        isSorted = false
                        sortedIndex =j
                    }
                }
                if (isSorted) {
                    //没有执行到交换的一步,说明已经有序了,可以直接退出了
                    break
                }
            }
            print(data)
        }