冒泡排序是一种简单的排序方式,通过比较相邻的的两个数的大小,并把更大的值放在右边,并把数组分为有序区和无序区,初始的有序区为空,每一次遍历一次数组都会确定一个无序区中最大的数,并把这个数放到有序区的左边,直至所有数组中的数字都在有序区的达到排序的思想。
排序过程如下图所示:
图片出自:go实现冒泡排序的示例代码-云海天教程 (yht7.com)
代码实现:
import java.util.Scanner;
public class BubbleSort {
public static void bubbleSort(int[] arr){
for (int i=1;i<arr.length;i++){//遍历次数
for (int j=0;j<arr.length-i;j++){
if (arr[j]>arr[j+1]){// 把更大的值放在左边
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("输入数组长度:");
int length = scanner.nextInt();
int[] arr = new int[length];
for (int i=0;i<arr.length;i++){
arr[i] = scanner.nextInt();
}
bubbleSort(arr);
System.out.println("排序后的数组为:");
for (int i : arr) {
System.out.print(i+"\t");
}
}
}
如代码所示,冒泡排序有两层for循环实现,时间复杂度为O(n^2),其中第一层循环用来控制遍历数组的次数共遍历n-1次,里面的循环用来比较无序区相邻的两个数的大小,随着每一次循环确定出一个无序数组中的最大值进入到有序数组中,里层循环的比较次数逐渐变小。
从时间复杂度上来看冒泡排序是不推荐的,运行所需要的时间比较长,但从空间复杂度的角度考虑还是具有一定的优势的,冒泡排序只需要一个辅助空间进行交换顺序所以时间复杂度为O(1),并且冒泡排序是一种稳定的排序,并不会交换相同大小的数。