一.原理
冒泡排序的原理:
他的核心就在于数与数之间的交换,首先先从第一个数字开始进行排序,每一轮排序都能将最大的数字放到最后面。第一轮将最大的数字交换到最后面,第二轮将第二大的数字交换到倒二位置。依次类推,要将一组数字排序完至少需要n-1次交换。
核心:每一趟遍历,将一个最大的数移到序列最末尾。
二.基本算法实现(JAVA)
public class BubbleSortMethod {
/**
* 冒泡排序法的初步实现
* @param arr:传入的排序的数组
* @return 返回排序好的数组
*/
public static int[] BubbleArr(int[] arr) {
//外圈循环首先限制循环次数,循环n-1次,不用循环到最后一个数字,所以length-1
for (int i = 0; i < arr.length - 1; i++) {
//内圈循环是因为每经历了一轮循环,就不用比较到
for (int j = 0; j < arr.length - 1 - i; j++) {
if(arr[j]>arr[j+1]) {
//记录大的数字,进行交换的过程
int temp = arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
return arr;
}
三.算法优化
上面代码由于每次循环都要循环n-1次,如果遇到已经排序好的数组那么这种做法无疑是浪费时间的。
改进方法:加入布尔值进行判断,如果一轮循环没有进入if判断则视为已经排序好的。直接退出循环。
public class BubbleSortMethod {
/**
* 冒泡排序法的初步实现
* @param arr:传入的排序的数组
* @return 返回排序好的数组
*/
public static int[] BubbleArr(int[] arr) {
//外圈循环首先限制循环次数,循环n-1次,不用循环到最后一个数字,所以length-1
//判断是否有序,先假设有序
boolean flag =true;
for (int i = 0; i < arr.length - 1; i++) {
//内圈循环是因为每经历了一轮循环,就不用比较到
for (int j = 0; j < arr.length - 1 - i; j++) {
if(arr[j]>arr[j+1]) {
//记录大的数字,进行交换的过程
int temp = arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
flag =false;
}
}
if(flag){
//退出循环,直接返回数组
break;
}
}
return arr;
}