目录
算法简介
冒泡排序:是一种简单稳定的排序算法,它适合小规模数据的排序。假如将待排序的数据当作泡泡,数据不同,泡泡就大小不同。假如我们想把数据从小到大排序,那么在排序的过程中,小泡泡会慢慢往前被交换到前边,也叫冒上来。
算法的稳定性是指在排序的过程中,不会改变相等元素的相对位置。假设对一个数组进行冒泡排序,这个数组中有两个值相等的元素a和b,a在b前面。从排序开始到结束,a和b的相对位置不会改变,a一直在b的前面。
时间复杂度: O(N^2)
空间复杂度: O(1)
一、算法步骤
假定是对数组进行从小到大的排序。
1、关键代码块:比较相邻的元素,如果前一个比后一个大,则进行交换。
2、第一趟排序:将数组中最大的数被交换到最后一个位置。
将第1个元素和第2个元素比较,如果第1个比第2个大,则交换第1个元素和第2个元素,否则不交换;
随后,将第2个元素和第3个元素比较,如果第2个比第3个大,则交换第2个元素和第3个元素,否则不交换;
...
最后,倒数第2个和最后1个进行比较,将大的数交换到最后一个位置。
3、第二趟排序:将数组中第2大的数被交换到倒数第二位。
将第1个元素和第2个元素比较,如果第1个比第2个大,则交换第1个元素和第2个元素,否则不交换;
随后,将第2个元素和第3个元素比较,如果第2个比第3个大,则交换第2个元素和第3个元素,否则不交换;
...
最后,倒数第3个和倒数第2个进行比较,将大的数交换到倒数第2个位置。
4、第三趟排序:将数组中第3大的数被交换到倒数第三位。
...
一共需要进行n-1趟排序。
二、代码实现(Java)
public class BubbleSort {
public static void main(String[] args){
int[] array = {3, 7, 1, 2, 1, 2, 9, 5, 8};
bubbleSort(array);
print(array);
}
private static void bubbleSort(int[] array){
if(array==null || array.length < 2) return;
//一共需要array.length-1趟比较
for(int i = array.length-1; i>0; i--){
//每一趟比较从0开始,到i-1结束
for(int j = 0; j<i; j++){
//进行数据交换
if(array[j]>array[j+1]){
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
private static void print(int[] array){
for (int x : array){
System.out.print(x+" ");
}
System.out.println();
}
}
三、代码优化
private static void bubbleSort(int[] array){
if(array==null || array.length < 2) return;
boolean flag; //是否进行了交换
//一共需要array.length-1趟比较
for(int i = array.length-1; i>0; i--){
flag = false;
//每一趟比较从0开始,到i-1结束
for(int j = 0; j<i; j++){
//进行数据交换
if(array[j]>array[j+1]){
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = true;
}
}
//未进行数据交换,说明数组剩余部分已经有序
if(!flag){
break;
}
}
}
下一篇 1.2、排序-选择排序(Select Sort)