冒泡排序
概念
重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序如从小到大、首字母从A到Z)错误就把他们交换过来。
原理
依次比较相邻的两个数,将数字小的放在前面,数字大的放在后面。
示例代码
/**
* 冒泡排序
*/
public class BubbleSort {
public static int[] sort(int[] arr){
for (int i = 1; i < arr.length; i++) { // 外层for循环控制的是总的比较趟(轮)数
for (int j = 0; j < arr.length-i; j++) { // 内层for循环控制的是每趟两两比较的次数
// 判断数组中的第j个元素是否比第j+1的元素大,大则进入判断语句中
if (arr[j] > arr[j+1]){
// 创建一个临时变量tmp,存放arr[j]位置的值
int tmp = arr[j];
// 将arr[j+1]位置的值覆盖到arr[j]的位置
arr[j] = arr[j+1];
// 将临时变量tmp的值覆盖到arr[j+1]的位置
arr[j+1] = tmp;
}
}
}
return arr;
}
// 测试
public static void main(String[] args) {
int[] arr = {1,4,2,5,6,8,3};
int[] sort = sort(arr);
for (int result:sort){
System.out.print(result+" ");
}
}
}
打印结果:
思路整理(画图说明)
当前的数比后一位数大时,就会和后一位数交换位置
优化
还可以进行一点小优化,当一趟比较下来都没有交换位置,那么就可以结束全部循环,将排序好的结果返回出去
public static int[] sort(int[] arr){
for (int i = 1; i < arr.length; i++) { // 外层for循环控制的是总的比较趟(轮)数
// 标志
boolean flag = true;
for (int j = 0; j < arr.length-i; j++) { // 内层for循环控制的是每趟两两比较的次数
// 判断数组中的第j个元素是否比第j+1的元素大,大则进入判断语句中
if (arr[j] > arr[j+1]){
// 创建一个临时变量tmp,存放arr[j]位置的值
int tmp = arr[j];
// 将arr[j+1]位置的值覆盖到arr[j]的位置
arr[j] = arr[j+1];
// 将临时变量tmp的值覆盖到arr[j+1]的位置
arr[j+1] = tmp;
// 因为还有进行交换位置的元素,将flag修改为false,进入下次循环
flag = false;
}
}
// 当flag为true时表示排序已完成,退出循环
if (flag){
break;
}
}
return arr;
}