思路:
一个数组排length-1轮,6个元素的数组就排5轮,每轮再比较length-i次,i为轮数
每轮都能找到一个最大值放在最后,这个最大值后面就不用比较了,所以排一轮少一次,直到所有最大值排完
所以用两轮for循环,第一for控制轮数,第二for控制两两比较次数,两两比较,大的就交换位置
package bubble.array;
/**冒泡排序*/
import java.util.Arrays;
import java.util.Random;
public class BubbleSort {
public static void main(String[] args) {
int[] a=new int[10];
for(int i=0;i<a.length;i++) {
a[i]=new Random().nextInt(100);//随机生成[0,100)以内的数
}
System.out.print(Arrays.toString(a));
//生成数组
System.out.print(a.length);
for(int i=1;i<=a.length-1;i++) {//控制外层轮数,共length-1轮
for(int j=0;j<a.length-i;j++) {//内层数字交换,共length-i(i代表轮数。!!!注意此处 不能写a.length不然会超过边界产生a【10】
if(a[j]>a[j+1]) {
int t = a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
System.out.print(Arrays.toString(a));
}
}
有可能出现提前排完的情况。添加一个flag完善一下代码
package bubble.array;
/**冒泡排序*/
import java.util.Arrays;
import java.util.Random;
public class BubbleSort {
public static void main(String[] args) {
int[] a=new int[10];
for(int i=0;i<a.length;i++) {
a[i]=new Random().nextInt(100);//随机生成[0,100)以内的数
}
System.out.print(Arrays.toString(a));
//生成数组
System.out.print(a.length);
for(int i=1;i<=a.length-1;i++) {//控制外层轮数,共length-1轮
boolean flag=false; //加一个flag完善方法,可能第2或第3轮就正好排完了,就跳出循环
for(int j=0;j<a.length-i;j++) {//内层数字交换,共length-i(i代表轮数。!!!注意此处 不能写a.length不然会超过边界产生a【10】
if(a[j]>a[j+1]) {
int t = a[j];
a[j]=a[j+1];
a[j+1]=t;
flag=true; //有次if操作代表此时还是乱序,否则排好了
}
}
if (flag==false) {//如果是false说明上面已经没有再进行排序了,说明排好了
break;
}
}
System.out.print(Arrays.toString(a));
}
}
来吧代码写的更优雅点,放到函数里
package bubble.array;
/**冒泡排序*/
import java.util.Arrays;
import java.util.Random;
public class BubbleSort {
public static void main(String[] args) {
int[] a=method1();//生成数组
System.out.println(Arrays.toString(a));
int[] bubbleA=method2(a); //排序函数
System.out.print(Arrays.toString(bubbleA));
}
public static int[] method1() {
int[] a=new int[10];
for(int i=0;i<a.length;i++) {
a[i]=new Random().nextInt(100);//随机生成[0,100)以内的数
}
return a;
}
public static int[] method2(int[] a) {
for(int i=1;i<=a.length-1;i++) {//控制外层轮数,共length-1轮
boolean flag=false; //加一个flag完善方法,可能第2或第3轮就正好排完了,就跳出循环
for(int j=0;j<a.length-i;j++) {//内层数字交换,共length-i(i代表轮数。!!!注意此处 不能写a.length不然会超过边界产生a【10】
if(a[j]>a[j+1]) {
int t = a[j];
a[j]=a[j+1];
a[j+1]=t;
flag=true; //有次if操作代表此时还是乱序,否则排好了
}
}
if (flag==false) {//如果是false说明上面已经没有再进行排序了,说明排好了
break;
}
}
return a;
}
}