基本介绍
冒泡排序通过两两比较的思想如果发现逆序则交换,依次将较大的元素逐渐从前面移到后面
实现思路
原始数组:2,7,-1,10,19
1、 第一趟排序:;
(1) 2,7,-1,10,19 2与7比较,2比7小,无需交换
(2) 2,-1,7,10,19 7与-1比较,-1比7小,发生了一次交换
(3) 2,-1,7,10,19 7与10比较,7比10小,无需交换
(4) 2,-1,7,10,19 10与19比较,10比19小,无需交换
第一趟结束19是最大的数排到了最右面
2、 第二趟排序;
(1) -1,2,7,10,19 2与-1比较,-1比2小,发生了一次交换
(2) -1,2,7,10,19 2与7比较,2比7小,无需交换
(3) -1,2,7,10 ,19 7与10比较,7比10小,无需交换
第二趟结束10是第二大的数排到了倒数第二位
3、 第三趟排序;
(1) -1,2,7,10 ,19 -1与2比较,-1比2小,无需交换
(2) -1,2,7 ,10 ,19 2与7比较,2比7小,无需交换
第三趟结束7是第三大的数排到了倒数第三位
4、 第四趟排序;
(1) -1,2,7 ,10 ,19 2与7比较,2比7小,无需交换
第四趟结束2是第四大的数排到了倒数第四位
最后一个元素无需比较
代码思路
代码分析思路
先定义一个数组与临时变量
int [] arr = {
2,7,-1,10,19 };
int temp;
1、 第一趟排序;
for (int j = 0; j < arr.length -1 ; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
2、 第二趟排序;
for (int j = 0; j < arr.length -2 ; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
3、 第三趟排序;
for (int j = 0; j < arr.length -3 ; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
4、 第四趟排序;
for (int j = 0; j < arr.length -4 ; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
发现有除了一个值从1到4变化,其它都不变,这个值的最大值刚好就是arr长度-1
最终代码
int [] arr = {
2,7,-1,10,19 };
int temp;
for (int i=1;i<arr.length;i++){
for (int j = 0; j < arr.length -i ; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println("第"+i+"趟排序后:"+ Arrays.toString(arr));
}
输出
代码优化分析
在上面的实现思路中,第一趟,第二趟排序过后发现已经是有序的了,我们可以在发现在一趟比较中没有发现交换的情况就认为已排好序不再进行排序。
优化后的代码
int[] arr = {
2, 7, -1, 10, 19};
int temp;
for (int i = 1; i < arr.length; i++) {
boolean flag = true;//true表示一次都没交换过
for (int j = 0; j < arr.length - i; j++) {
if (arr[j] > arr[j + 1]) {
flag = false;
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println("第" + i + "趟排序后:" + Arrays.toString(arr));
if (flag) {
//发现没有比较过就退出
break;
}
}
输出截图
版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: