冒泡排序:通过对 待排序的序列从前向后依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后面,就像水底下的气泡一样逐渐向上冒。
优化:因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行交换,就说明序列有序,因此要在排序的过程中设置一个flag判断元素是否进行过交换,从而减少不必要的比较
目录
普通版冒泡排序
package 冒泡排序;
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
int[] arr={5,4,1,-2,0,9,7};
int temp=0;
for (int i=0;i<arr.length-1;i++){//比如数组长度是5,则length-1为4,只需要比较4轮,把四个大的数放在后面,第一个数自然最小,不用再比比较!
for (int j=0;j<arr.length-1-i;j++){//比如是5个数,每一轮需要比较5-1=4-i;因为没比较一轮,会把最大的数依次放在后面,那个i其实就是已经比较过的筛选出来的大数(第一趟排序比较4次 第二趟3次)
if (arr[j]>arr[j+1]){
temp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
}
}
System.out.println("第"+(i+1)+"排序:");
System.out.println(Arrays.toString(arr));
}
}
}
升级版冒泡排序
package 冒泡排序;
import java.util.Arrays;
public class NewBubbleSort {
public static void main(String[] args) {
int[] arr={5,4,1,-2,0,9,7};
int temp=0;
boolean flag=false;
for (int i=0;i<arr.length-1;i++){//比如数组长度是5,则length-1为4,只需要比较4轮,把四个大的数放在后面,第一个数自然最小,不用再比比较!
for (int j=0;j<arr.length-1-i;j++){//比如是5个数,每一轮需要比较5-1=4-i;因为没比较一轮,会把最大的数依次放在后面,那个i其实就是已经比较过的筛选出来的大数(第一趟排序比较4次 第二趟3次)
if (arr[j]>arr[j+1]){
flag=true;
temp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
}
}
if (flag) {
System.out.println("第" + (i + 1) + "排序:");
System.out.println(Arrays.toString(arr));
flag=false;//重置flag 进行下次
}else {
break;
}
}
}
}