冒泡排序详解及优化
1. 思路:
- 比较数组中,两个相邻的元素,如果第一个比第二个大,交换位置;
- 每次比较,会产生出一个最大,或者最小的数;
- 下一轮则可少一次排序;
- 依次循环,直到结束。
2. 图解分析:
-
以数组int[] arr = {6, 3, 5, 7, 0}为例,图解分析如图所示:
-
总结图解分析。外层共循环了arrr.length-1次,外层循环增加一次,对应内层循环就减少一次。
-
时间复杂度=O(n2);空间复杂度=O(1), 是一种稳定的排序算法。
3. 代码实现:
import java.util.Arrays;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
//利用Scanner输入数组
Scanner scanner = new Scanner(System.in);
int[] a = new int[10];
for(int i = 0; i < a.length; i++){
a[i] = scanner.nextInt();
}
BubbleSort(a);
System.out.println(Arrays.toString(a));
scanner.close();
}
//m冒泡排序
public static void BubbleSort(int[] arr){
//临时变量
int t;
//外层循环,判断要走多少次
for(int i = 0; i < arr.length-1; i++){
//内层循环,从头一直到已经确定的位置前,两两比较
for(int j = 0; j < arr.length-i-1; j++){
//如果第一个数比第二个大,交换位置
if(arr[j] > arr[j+1]){
t = arr[j];
arr[j] = arr[j+1];
arr[j+1] = t;
}
}
}
}
}
4. 冒泡排序优化
public static void BubbleSort(int[] arr){
int t;
for(int i = 0; i < arr.length-1; i++){
boolean flag = false;
for(int j = 0; j < arr.length-i-1; j++){
if(arr[j] > arr[j+1]){
t = arr[j];
arr[j] = arr[j+1];
arr[j+1] = t;
flag = true;
}
}
if(flag == false){
break;
}
}
}