冒泡算法的逻辑分析

第一篇算法小结,先来一个简单的冒泡算法热热身~

 

逻辑分析

在给定的一个数据中,我们有时候需要将数据对象进行某种顺序排列,常见的排列方式为升序或是降序,冒泡算法是处理这类排序的经典方法。

 

给定一个数组

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         }

 

就此,大功告成~

 

posted @ 2017-03-23 18:38  NOthingAJ  阅读(445)  评论(0编辑  收藏  举报