分析:
- 依次比较两个相邻的元素,将值大的元素交换到右边
- N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数
冒泡排序的优点:
- 每进行一趟排序,就会少比较一次,因为每进行一趟排序都会找出一个较大值。如上例:第一趟比较之后,排在最后的一个数一定是最大的一个数,第二趟排序的时候,只需要比较除了最后一个数以外的其他的数,同样也能找出一个最大的数排在参与第二趟比较的数后面,第三趟比较的时候,只需要比较除了最后两个数以外的其他的数,以此类推……也就是说,没进行一趟比较,每一趟少比较一次,一定程度上减少了算法的量。
代码实现
public class Test {
public static void main(String[] args) {
int[] arrs = {11, 15, 12, 10, 8, 5, 4, 15};
bubbleSort (arrs);
System.out.println (Arrays.toString (arrs));
}
/**
* 冒泡排序
*
* @param arrs
* @return
*/
public static void bubbleSort(int[] arrs) {
// 获取数组的长度
int len = arrs.length;
// 判断边界,为null或只存在一个数字直接返回
if (arrs == null || len < 2) return;
/**
* 思想:两两比较,较大的数排右边,一轮下来可以确定数组的最后一位为最大数值
* len - i - 1 表示每轮循环不比较已确定的数值
*/
for (int i = 0; i < len - 1; i++) {
for (int j = 0; j < len - i - 1; j++) {
// 相邻两数比较,大的数组替换位置
if (arrs[j] >= arrs[j + 1]) {
arrs[j] = arrs[j + 1] + arrs[j] - (arrs[j + 1] = arrs[j]);
}
}
}
}
}