冒泡排序
1.比较数组中,两个相邻的元素,如果第一个数比第二个数大,我们就交换他们位置
2.每一次比较,都会产生出一个最大,或者最小的数字
3.每一轮结束下一轮都会减少一次排序
4.依次循环,直到结束
5.冒泡排序需要两个循环,第一个循环是确定一共要走多少次,第二个循环是判断走到哪里停止避免走多次数所以需要用(j<arr.length-1-i)每一个大循环过后i增加1,j里面的循环就减少1,(原理就是每次能确定一个最大的数或者最小的数)
代码部分(内有解析)
package Array;
import java.util.Arrays;
public class Demo07 {
public static void main(String[] args) {
int[]arr={1,6,9,3,5,4};
sort(arr);
System.out.println(Arrays.toString(arr));
}
//冒泡排序
public static int[] sort(int[]arr){
//外界循环,判断我们需要走多少次
for (int i = 0; i < arr.length-1; i++) {//一般都是默认length-1
//内层循环,进行比较排序,如果第一个数比第二个数大,那么交换他们的位置//需要利用第三个变量来进行交换
for (int j = 0; j < arr.length-1-i; j++) {//这一步是关键(因为首先确定的肯定是最后面的值,所以下一次就不用循环到最后的一个值)
//而每一次进行后都要+1,正好符合i的增长方式,所以需要减去i
if(arr[j]>arr[j+1]){
int tmp=0;
tmp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
}
}
}
return arr;
}
}
优化部分
package Array;
import java.util.Arrays;
public class Demo07 { //冒泡排序
public static void main(String[] args) {
int[]arr={1,6,9,3,5,4};
sort(arr);
System.out.println(Arrays.toString(arr));
}
//冒泡排序
public static int[] sort(int[]arr){
boolean flag=false;
//外界循环,判断我们需要走多少次
for (int i = 0; i < arr.length-1; i++) {//一般都是默认length-1
//内层循环,进行比较排序,如果第一个数比第二个数大,那么交换他们的位置//需要利用第三个变量来进行交换
for (int j = 0; j < arr.length-1-i; j++) {//这一步是关键(因为首先确定的肯定是最后面的值,所以下一次就不用循环到最后的一个值)
//而每一次进行后都要+1,正好符合i的增长方式,所以需要减去i
if(arr[j]>arr[j+1]){
int tmp=0;
tmp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
flag=true;
}
}
if(flag==false){
break;
}
}
return arr;
}
}
优化解析:
在冒泡排序的方法里创建一个flag这个flag就是来判断外面的大循环是否还继续循环的
boolean flag =false;//在循环外定义
在第一个for结束前重新赋值 flag=true;表示循环还在进行
在第一个for 借宿后 判断flag是否改变了,如果没有变就表示,这个循环里面已经停止然后break;