冒泡排序算法的优化(思路分析)
首先我们要优化冒泡排序那么我们肯定是要知道我们的哪一点是可以优化的,只要知道了那一点是可以优化的我们才可以对其进行优化
待优化点: 如果我们发现在某趟排序中没有生过一次交换,则可以提前结束冒泡
-
如果在某趟排序中一次交换都没有发生过,那么就说明在这一趟之前的一趟已经是排好序了
-
那么我们如何用代码实现判断是不是某趟排序中一次交换都没有发生过?
- 我们可以定义一个boolean类型的标识变量flag, 初始值为false,然后在我们的每趟排序中交换两个位置元素值的代码中写上flag = true,就是表示如果在某趟排序中执行了交换位置的操作,那么就将flag标识变量设置为true, 那么我们就可以在每一趟排序执行完之后去判断,如果flag的值在一趟执行完之后还是false,那么就表示这趟排序中没有元素交换,那么就直接break退出冒泡排序(也就是退出外层for循环)即可
- 但是要注意: 如果我们的一趟排序中有交换数值的操作发生,这个时候flag的值就会变为true, 等到一趟排序完之后,判断flag的值为true,那么就表示发生过交换,但是注意: 这个时候我们在开始下一趟排序之前我们一定要将flag的值又设置为false,也就是我们要保证在每趟排序开始之前我们的flag变量的值要为false,所以我们就要在每次排序后进行判断,如果flag的值为true,那么就将flag的值重新设置为false,那么可能有的人会问: 如果不设置为false会怎么样?
- 如果不将flag的值设置为false,那么即使下一趟中没有执行过交换数值的操作,但是由于我们的flag的值在上一次执行完之后已经是true了,那么这里就会判断flag的值为true,就会继续执行下一次,所以这个就会一直执行下去,知道执行完数组长度-1趟为止 —> 其实也就相当于我们的优化算法失效了
- 但是要注意: 如果我们的一趟排序中有交换数值的操作发生,这个时候flag的值就会变为true, 等到一趟排序完之后,判断flag的值为true,那么就表示发生过交换,但是注意: 这个时候我们在开始下一趟排序之前我们一定要将flag的值又设置为false,也就是我们要保证在每趟排序开始之前我们的flag变量的值要为false,所以我们就要在每次排序后进行判断,如果flag的值为true,那么就将flag的值重新设置为false,那么可能有的人会问: 如果不设置为false会怎么样?
- 我们可以定义一个boolean类型的标识变量flag, 初始值为false,然后在我们的每趟排序中交换两个位置元素值的代码中写上flag = true,就是表示如果在某趟排序中执行了交换位置的操作,那么就将flag标识变量设置为true, 那么我们就可以在每一趟排序执行完之后去判断,如果flag的值在一趟执行完之后还是false,那么就表示这趟排序中没有元素交换,那么就直接break退出冒泡排序(也就是退出外层for循环)即可
-
我们在上面的冒泡排序优化中使用到的判断在某一趟排序中是否一次交换都没有发生过的算法是我们在实际编程中经常会使用到的一个小算法
- 就是通过一个boolean类型的标识变量并给其一个初始值false,如果它执行了某个操作就表示就将其设置为true ,并且一定要注意: 如果有循环的发生,那么在下一次循环开始之前一定要确保这个标识变量的值为false,也就是说如果一次循环结束后标识变量的值变成了true, 那么我们要将这个值重新设置为false,只有这个值为false才能正确的判断下一次循环中是否执行了某个操作