冒泡算法的逻辑分析
第一篇算法小结,先来一个简单的冒泡算法热热身~
逻辑分析
在给定的一个数据中,我们有时候需要将数据对象进行某种顺序排列,常见的排列方式为升序或是降序,冒泡算法是处理这类排序的经典方法。
给定一个数组
int[] arr = {9,8,7,6,5};
要将这个降序数组重排为升序数组,我们可以通过:
1.将9和8进行比较,较大者和较小者换位-->{8,9,7,6,5}
2.将9和7进行比较,较大者和较小者换位-->{8,7,9,6,5}
.
.
.
最终得到{8,7,6,5,9}
- 基本实现:
1 int[] arr = { 9, 8, 7, 6, 5 }; 2 3 for (int i = 0; i < arr.length - 1; i++) { 4 if (arr[i] > arr[i + 1]) { 5 int temp = arr[i]; 6 arr[i] = arr[i + 1]; 7 arr[i + 1] = temp; 8 } 9 }
- 之后,需要开始第二轮的排序,自然想到使用嵌套for循环来实现:
1 int[] arr = { 9, 8, 7, 6, 5 }; 2 3 for (int j = 0; j < arr.length - 1; j++) { 4 for (int i = 0; i < arr.length - 1; i++) { 5 if (arr[i] > arr[i + 1]) { 6 int temp = arr[i]; 7 arr[i] = arr[i + 1]; 8 arr[i + 1] = temp; 9 } 10 } 11 }
- 这时,我们会发现在遍历过程中,每一次遍历都会增加一次不必要的重复比较,具体逻辑分析过程可以列举每一次的两个数字比较发现。因此在第二次for循环中,随着遍历的递进,都需要减少1次arr.length,实际上可以在内部for循环中将循环条件改为arr.length-1 ---> arr.length-(1+j):
1 int[] arr = { 9, 8, 7, 6, 5 }; 2 3 for (int j = 0; j < arr.length - 1; j++) { 4 for (int i = 0; i < arr.length - (1 + j); i++) { 5 if (arr[i] > arr[i + 1]) { 6 int temp = arr[i]; 7 arr[i] = arr[i + 1]; 8 arr[i + 1] = temp; 9 } 10 } 11 }
- 现在,这个排序算法已经很好了,但是还可以继续优化,如果我们遇到仅需要一次排序就可以完成的数组,如:{9,5,6,7,8},我们可以通过加入if和boolean来升级当前排序:
1 int[] arr = { 9,5,6,7,8 }; 2 boolean b = true; 3 4 for (int j = 0; j < arr.length - 1; j++) { 5 b = false; 6 for (int i = 0; i < arr.length - 1 - j; i++) { 7 if (arr[i] > arr[i + 1]) { 8 int temp = arr[i]; 9 arr[i] = arr[i + 1]; 10 arr[i + 1] = temp; 11 b = true; 12 System.out.println(Arrays.toString(arr)); 13 } 14 } 15 if(b == false) break; 16 }
就此,大功告成~