冒泡排序
-
原理:每一轮循环总能确定一个数的最终位置
- 例如,从小到大排序,第一轮循环是找一个最大的一个数,最大的一个数在第一个,那么它就会依次和第二个数,第三个数,第三个数。。。。交换位置,最终它在最后一位。
- 例如,从小到大排序,第一轮循环是找一个最大的一个数,最大的一个数在第一个,那么它就会依次和第二个数,第三个数,第三个数。。。。交换位置,最终它在最后一位。
-
步骤:从首位起,一次性比较两个元素,如果这两个元素位置顺序错误,那么就交换位置,反之不交换
-
注意
- 从小到大排序,外层循环第一轮循环完后会找到最大的数
- 从大到小排序,外层循环第一轮循环完后会找到最小的数
-
编程思路:
- 外层循环:每一轮循环找到最大或最小的数并确定它的位置
- 内层循环:每一轮循环比较两个数的大小有必要则交换
- 循环次数(以{3,2,4,1,5,0}为例)
- 外层循环:一共六个数,后五个数的位置确定,第一个数也就自然确定,所以只需要循环五次,则arr.length-1
- 内层循环:六个数,两两比较,也只需要五次(不信你扳手指,相邻的两两手指打架,五根手指打四次架)则也是arr.length-1
-
代码为例:
package cn.javase.selfstudy; public class ArrayBubbleSort { public static void main(String[] args) { int[] arr = new int[]{10, 12, 33, 6, 90, 46, 1, 5, 7, 3};//静态初始化一个数组 System.out.print("["); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + (i < arr.length - 1 ? "," : "]")); }//6789行打印原数组元素 System.out.println(); System.out.println("---------------------");//10 11行分界线 for (int i = 0; i < arr.length - 1; i++) {//外层循环每一轮找到最大的数并确定位置 for (int j = 0; j < arr.length - 1; j++) {//内层循环每一轮比较有必要则交换 if (arr[j] > arr[j + 1]) {//如果前一个数大于后一个数则交换 arr[j] = arr[j] + arr[j + 1]; arr[j + 1] = arr[j] - arr[j + 1]; arr[j] = arr[j] - arr[j + 1]; } System.out.print("["); for (int x = 0; x < arr.length; x++) { System.out.print(arr[x] + (x < arr.length - 1 ? "," : "]")); } System.out.println();//19 20 21 22 23行打印每一次比较后的结果 } } System.out.println("---------------------"); System.out.print("["); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + (i < arr.length - 1 ? "," : "]")); }//29 30 31 32行打印排序后的数组元素 } }
[10,12,33,6,90,46,1,5,7,3]//原数组 --------------------- //外层循环一次空一行以示区分 //每一行都是交换后的结果 [10,12,33,6,90,46,1,5,7,3]//10和12比较不交换 [10,12,33,6,90,46,1,5,7,3]//12和33比较不交换 [10,12,6,33,90,46,1,5,7,3]//33和6比较交换 [10,12,6,33,90,46,1,5,7,3]//33和90比较不交换 [10,12,6,33,46,90,1,5,7,3]//90和46比较交换 [10,12,6,33,46,1,90,5,7,3]//90和1交换 [10,12,6,33,46,1,5,90,7,3]//90和5交换 [10,12,6,33,46,1,5,7,90,3]//90和7交换 [10,12,6,33,46,1,5,7,3,90]//90和3交换 //最终把最大的90确定到了最末的位置 //大家看,90依次往后移动,像不像泡泡浮出水 [10,12,6,33,46,1,5,7,3,90] [10,6,12,33,46,1,5,7,3,90] [10,6,12,33,46,1,5,7,3,90] [10,6,12,33,46,1,5,7,3,90] [10,6,12,33,1,46,5,7,3,90] [10,6,12,33,1,5,46,7,3,90] [10,6,12,33,1,5,7,46,3,90] [10,6,12,33,1,5,7,3,46,90] [10,6,12,33,1,5,7,3,46,90]//重复比较 //确定了倒数第二大46的位置 [6,10,12,33,1,5,7,3,46,90] [6,10,12,33,1,5,7,3,46,90] [6,10,12,33,1,5,7,3,46,90] [6,10,12,1,33,5,7,3,46,90] [6,10,12,1,5,33,7,3,46,90] [6,10,12,1,5,7,33,3,46,90] [6,10,12,1,5,7,3,33,46,90] [6,10,12,1,5,7,3,33,46,90]//重复比较 [6,10,12,1,5,7,3,33,46,90]//重复比较 //确定了倒数第三大33的位置 [6,10,12,1,5,7,3,33,46,90] [6,10,12,1,5,7,3,33,46,90] [6,10,1,12,5,7,3,33,46,90] [6,10,1,5,12,7,3,33,46,90] [6,10,1,5,7,12,3,33,46,90] [6,10,1,5,7,3,12,33,46,90] [6,10,1,5,7,3,12,33,46,90]//重复比较 [6,10,1,5,7,3,12,33,46,90]//重复比较 [6,10,1,5,7,3,12,33,46,90]//重复比较 //确定了倒数第4大12的位置 [6,10,1,5,7,3,12,33,46,90] [6,1,10,5,7,3,12,33,46,90] [6,1,5,10,7,3,12,33,46,90] [6,1,5,7,10,3,12,33,46,90] [6,1,5,7,3,10,12,33,46,90] [6,1,5,7,3,10,12,33,46,90]//重复比较 [6,1,5,7,3,10,12,33,46,90]//重复比较 [6,1,5,7,3,10,12,33,46,90]//重复比较 [6,1,5,7,3,10,12,33,46,90]//重复比较 //确定了10的位置 [1,6,5,7,3,10,12,33,46,90] [1,5,6,7,3,10,12,33,46,90] [1,5,6,7,3,10,12,33,46,90] [1,5,6,3,7,10,12,33,46,90] [1,5,6,3,7,10,12,33,46,90]//重复比较 [1,5,6,3,7,10,12,33,46,90]//重复比较 [1,5,6,3,7,10,12,33,46,90]//重复比较 [1,5,6,3,7,10,12,33,46,90]//重复比较 [1,5,6,3,7,10,12,33,46,90]//重复比较 //确定了7的位置 [1,5,6,3,7,10,12,33,46,90] [1,5,6,3,7,10,12,33,46,90] [1,5,3,6,7,10,12,33,46,90] [1,5,3,6,7,10,12,33,46,90]//重复比较 [1,5,3,6,7,10,12,33,46,90]//重复比较 [1,5,3,6,7,10,12,33,46,90]//重复比较 [1,5,3,6,7,10,12,33,46,90]//重复比较 [1,5,3,6,7,10,12,33,46,90]//重复比较 [1,5,3,6,7,10,12,33,46,90]//重复比较 //确定了6的位置 [1,5,3,6,7,10,12,33,46,90] [1,3,5,6,7,10,12,33,46,90] [1,3,5,6,7,10,12,33,46,90]//重复比较 [1,3,5,6,7,10,12,33,46,90]//重复比较 [1,3,5,6,7,10,12,33,46,90]//重复比较 [1,3,5,6,7,10,12,33,46,90]//重复比较 [1,3,5,6,7,10,12,33,46,90]//重复比较 [1,3,5,6,7,10,12,33,46,90]//重复比较 [1,3,5,6,7,10,12,33,46,90]//重复比较 //确定了5的位置 [1,3,5,6,7,10,12,33,46,90] [1,3,5,6,7,10,12,33,46,90]//重复比较 [1,3,5,6,7,10,12,33,46,90]//重复比较 [1,3,5,6,7,10,12,33,46,90]//重复比较 [1,3,5,6,7,10,12,33,46,90]//重复比较 [1,3,5,6,7,10,12,33,46,90]//重复比较 [1,3,5,6,7,10,12,33,46,90]//重复比较 [1,3,5,6,7,10,12,33,46,90]//重复比较 [1,3,5,6,7,10,12,33,46,90]//重复比较 //确定了1和3的位置 --------------------- [1,3,5,6,7,10,12,33,46,90]//最终结果
大家也看到了,重复比较的太多了,可以对算法进行优化,接下来的优化就交给大家来完成吧。