排序思路:比较相邻两数,每一轮都将该轮最大(小)的数移动到数组的最右(左)侧
核心:两层循环
内层循环——控制每轮比较的次数
外层循环——控制轮数
优化思路:通过改变循环条件以及对特殊情况的考虑,以达到减少比较次数的效果
示例:从键盘输入10个整数,将他们升序排列并输出
package come.byyte.Demo;
import java.util.Scanner;
/**
* 你的日积月累 终会成为别人的望尘莫及
*/
//冒泡排序
public class demo01 {
public static void main(String[] args) {
int[] a=new int[10];
Scanner sc=new Scanner(System.in);
for (int i = 0; i < a.length; i++) {
a[i]=sc.nextInt();
}
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a.length-1; j++) {
if(a[j]>a[j+1]){
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}//内层循环控制每轮比较的次数
}//外层循环控制比较的轮数
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
}
}
示例优化1——改变循环条件
内层循环:在每轮比较中,没必要从头比到尾,因为每轮都将最大的数移动到了尾部
外层循环:轮数可以减少为:数组长度-1
for (int i = 0; i < a.length-1; i++) {
for (int j = 0; j < a.length-1-i; j++) {
if(a[j]>a[j+1]){
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}//内层循环控制每轮比较的次数
}//外层循环控制比较的轮数
示例优化2——考虑特殊情况
对于本来就是升序排列或者通过几轮排序变为升序的整数序列,就失去了进行下一轮排序的意义,因此可以通过增设信号量的方式来避免这种情况的发生
for (int i = 0; i < a.length-1; i++) {
boolean signal=true;
for (int j = 0; j < a.length-1-i; j++) {
if(a[j]>a[j+1]){
signal=false;
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}//内层循环控制每轮比较的次数
if(signal==true)
break;//证明该整数序列已经升序排列,及时跳出循环
}//外层循环控制比较的轮数