@TOC冒泡排序
介绍
冒泡排序:类似于水中冒泡,较大的数沉下去,较小的数慢慢冒起来,假设从小到大,即为较大的数慢慢往后排,较小的数慢慢往前排。其平均时间复杂度为O(n^2 ),最差情形的时间复杂度为O(n^2),最好的情形时间复杂度为O(n)。较为适合数据量较小的排序
实现:利用双重循化遍历数组
1、外循环遍历arr.length-1次把最大的数放到最后
2、内循环比较相邻的arr.length-1-i个数,若arr[i]大于arr[i+1]则互换位置,外循环每遍历一次,内循环则减少一次比较次数
如下图
实现
public class BubbleSort {
public static void bubbleSort(int[] arr) {
int temp=0;
for(int i=0;i<arr.length-1;i++) { //需要比较arr.lenth-1次,每一次找出最大的数字放到倒数第i位
for(int j=0;j<arr.length-i-1;j++) { //每一次内循环比上一次少
//前面的数比后面的数大则交换
if(arr[j]>arr[j+1]) {
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
System.out.println("第"+(i+1)+"次排序结果:"+Arrays.toString(arr));
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int [] arr= {7,2,-5,10,18};
bubbleSort(arr);
}
}
结果
优化
上面冒泡排序的实现在情形相对较好的情下是重复排序的,我们可以设置一个标签,当内循环未发生交换时则视为排序成功
public class BubbleSort {
public static void bubbleSort(int[] arr) {
int temp=0;
boolean flag=false;
for(int i=0;i<arr.length-1;i++) { //需要比较arr.lenth-1次,每一次找出最大的数字放到倒数第i位
for(int j=0;j<arr.length-i-1;j++) { //每一次内循环比上一次少
//前面的数比后面的数大则交换
if(arr[j]>arr[j+1]) {
flag=true;
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
if(flag==false) { //内循环一次都为发生交换,则已排好序
break;
}else {
flag=false; //重置flag,进行下次比较
}
System.out.println("第"+(i+1)+"次排序结果:"+Arrays.toString(arr));
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int [] arr= {7,2,-5,10,18};
bubbleSort(arr);
}
}
结果