冒泡排序的原理是两两比较相邻记录的元素,反序则交换,本质上都是将一连串的元素按照一定的规则重新排列。 思考逻辑: 比较相邻的元素,如果前一个比后一个大,将它们进行交换。如果只有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") }