(一)冒泡排序
1、由来:这个算法的名字由来是因为越大的元素会经由交换慢慢“浮“到数列的顶端,就如同碳酸饮料中二氧化碳的气泡最终会浮到顶上一样,故名“冒泡排序”。
2、 原理:如其名,其实现过程是对比相邻的元素值,如果满足条件就交换元素值,将较小的元素值移动到数组的前面,将较大的元素值移动到数组的后面,这样数组元素就像气泡一样从底部升到顶部。
3、时间复杂度:O(n^2)
4、算法稳定性:稳定排序算法
5、思路:java中的冒泡排序在双层循环中实现,其中外层循环控制的是排序的轮数,总循环次数为排序数组的长度减1,内层循环主要用于比较相邻元素的大小,以确定是否要交换位置,对比和交换次数依排序轮数减少。
6、给定一个数组实例:int[] arr = {90,81,87,32,21,93}
7、冒泡排序代码为:
package com.qiao.day1;
public class Bubble {
public static void main(String[] args) {
int[] arr = { 90, 81, 87, 32, 21, 93 };
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
System.out.print("这是第" + i + "次比较的结果:");
show(arr);
System.out.println();
}
}
public static void show(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}
8、排序分析:
我们要对这个数组{90,81,87,32,21,93}进行排序,若要按照从小到大的顺序排序,则第一轮的排序应该是这样的:
|90|81|87|32|21|93| 先将90和81进行比较,因90>81,所以将这两个数交换位置,得到:
|81|90|87|32|21|93| 在将90和87进行比较,因90>87,所以将这两个数交换位置,得到:
|81|87|90|32|21|93| 在将90和32进行比较,因90>32,所以将这两个数交换位置,得到:
|81|87|32|90|21|93| 在将90和21进行比较,因90>21,所以将这两个数交换位置,得到:
|81|87|32|21|90|93| 在将90和93进行比较,因90<93,所以不需要交换位置,
初始化排序结果为:{81,87,32,21,90,93},在第一轮的排序基础之上进行第二轮排序:
|81|87|32|21|90|93| 将81和87进行比较,因81<87,所以这两个数不交换位置,得到:
|81|87|32|21|90|93| 将87和32进行比较,因87>32,所以交换这两个数的位置,得到:
|81|32|87|21|90|93| 将87和21进行比较,因87>21,所以交换这两个数的位置,得到:
|81|32|21|87|90|93| 将87和90进行比较,因87<90,所以不需要交换位置,得到:
|81|32|21|87|90|93| 将90和93进行比较,因90<93,所以不需要交换位置,得到:
|81|32|21|87|90|93|
第一轮的排序结果为:{81,32,21,87,90,93},在第二轮的排序基础上进行第三轮排序:
|81|32|21|87|90|93| 将81和32进行比较,因81>32,所以交换这两个数的位置,得到:
|32|81|21|87|90|93| 将81和21进行比较,因81>21,所以交换这两个数的位置,得到:
|32|21|81|87|90|93| 将81和87进行比较,因81<87,所以不需要交换位置,得到:
|32|21|81|87|90|93| 将87和90进行比较,因87<90,所以不需要交换位置,得到:
|32|21|81|87|90|93| 将90和93进行比较,因90<93,所以不需要交换位置,得到:
|32|21|81|87|90|93|
第二轮的排序结果为:{32,21,81,87,90,93},如此循环,得到的第三轮的排序结果为:{21,32,81,87,90,93},
最后的排序结果为{21,32,81,87,90,93}
9、代码分析:
(1)首先明确我们所需要的的是用冒泡算法去给{90,81,87,32,21,93}这几个数排序
(2)明确冒泡排序算法的思路,两两比较,然后比较的轮数为要排序的数组长度减1
(3)该代码所展示的是每轮比较的结果
10、结果截图:
11、最后的最后,附图: