Java冒泡排序
1.冒泡排序-从后开始冒泡
如,将数组中的数字进行升序(降序)排列。需要进行n-1轮冒泡,(n代表数组长度),
下面案例从后开始比较,将值小的往前冒泡排序比较:
public static void main(String[] args) {
// 2. 五个数字11,22,9,7,1 升序排序
int[] arr ={11,22,9,7,1};
// 冒泡排序
for (int i = 0; i < arr.length; i++) {
// 从后冒泡
for (int j = arr.length-1; j > i; j--) {
if(arr[j-1]<arr[j]){//升序
// 如果左边的数小于右边的数,则进行交换
//注意索引越界问题,arr[j+1]会报索引越界错误
int temp =arr[j];
arr[j]= arr[j-1];
arr[j-1]=temp;
}
}
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
2.冒泡排序-从前冒泡
如,将数组中的数字进行升序(降序)排列。需要进行n-1轮冒泡,(n代表数组长度),
冒泡排序速记口诀(升序):
- N 个数字来排队
- 两两相比小靠前
- 外层循环 n-1 (冒泡趟数)
- 内层循环 n-1-i(比较次数)
下面案列从前开始比较冒泡排序比较:
public static void main(String[] args) {
int[] arr ={11,22,9,7,1};
for (int i = 0; i < arr.length-1; i++) {
// 从前冒泡
for (int j = 0; j < arr.length-1-i; j++) {
// 注意数组索引越界问题 arr[j-1]会越界错误
if (arr[j]>arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
//输出打印数组
System.out.println(Arrays.toString(arr));
}
3.冒泡排序优化
思路:将值小的往前冒泡,当某次排序比较没有发生交换时说明此时已经整体有序。
public static void main(String[] args) {
// 2. 五个数字11,22,9,7,1 升序排序
// 优化冒泡排序
int[] arr ={11,22,9,7,1};
boolean flag;
// 冒泡排序
for (int i = 0; i < arr.length; i++) {
flag = false;
//从后冒泡
for (int j = arr.length-1; j > i; j--) {
if(arr[j-1]>arr[j]){
int temp =arr[j];
arr[j]= arr[j-1];
arr[j-1]=temp;
flag = true;
}
// break;
}
if(flag == false){//说明没有进入内层循环进行交换 即有序
for (int j = 0; j < arr.length; j++) {
System.out.print(arr[j]+" ");
}
break;
}
}