分析:
根据上边对冒泡排序过程的分析,对5个数排序需要经过4轮,每轮经过一定次数的比较,第1轮经过5-1=4次比较,第2轮经过5-2=3次比较,总结为每轮的比较次数为5减轮数。
使用双重循环来实现冒泡排序,外层循环控制轮数,内层循环控制比较次数。
每次对相邻的两个数比较,顺序错误则交换这两个数的顺序,如果按升序排则将大数后移,按降序排将小数后移。
代码如下:
/**
* 面向过程编程-数组-冒泡排序
*
* @author 攀博课堂(www.pbteach.com)
*
*/
public class ArrayDemo6 {
public static void main(String[] args) {
int[] datas = {8,7,6,5,4};
//排序前
System.out.println("排序前");
output(datas);
//排序
sort(datas);
//排序后
System.out.println("排序后");
output(datas);
}
//冒泡排序
public static void sort(int[] datas) {
//数组的长度
int num = datas.length;
for (int i = 0; i < num-1; i++) {//外循环控制比较轮数
for (int j = 0; j < num-i-1; j++) {
if(datas[j]>datas[j+1]) {
int temp = datas[j];
datas[j] = datas[j+1];
datas[j+1] = temp;
}
}
}
}
//输出数组的元素
public static void output(int[] datas) {
for (int i = 0; i < datas.length; i++) {
System.out.println(datas[i]);
}
}
}
输出:
排序前
8
7
6
5
4
排序后
4
5
6
7
8
分析:
如果在第二层循环没有进行交换操作说明已经排序完成,所以可以用一个boolean标记是否进行数据交换,根据标记判断是否进行交换,如果没有进行交换则退出外层循环。
为了更好的理解整个算法同时也加入轮数、交换次数的记录。
代码如下:
/**
* 冒泡排序
*
* @author 攀博课堂(www.pbteach.com)
*
*/
public class ArrayDemo6 {
public static void main(String[] args) {
int[] datas = {1,2,3,4,5};
//排序前
System.out.println("排序前");
output(datas);
//排序
sort(datas);
//排序后
System.out.println("排序后");
output(datas);
}
//冒泡排序
// public static void sort(int[] datas) {
// //数组的长度
// int num = datas.length;
// for (int i = 0; i < num-1; i++) {//外循环控制比较轮数
// for (int j = 0; j < num-i-1; j++) {
// if(datas[j]>datas[j+1]) {
// int temp = datas[j];
// datas[j] = datas[j+1];
// datas[j+1] = temp;
// }
// }
//
// }
// }
public static void sort(int[] datas) {
//比较轮数
int a = 0;
//交换的次数
int b = 0;
//是否进行交换,false表示没有进行交换,true表示进行了交换
boolean sign = false;
//数组的长度
int num = datas.length;
for (int i = 0; i < num-1; i++) {//外循环控制比较轮数
sign = false;//复位标记
for (int j = 0; j < num-i-1; j++) {
if(datas[j]>datas[j+1]) {
int temp = datas[j];
datas[j] = datas[j+1];
datas[j+1] = temp;
b++;//交换次数加1
sign = true;//标记进行了交换
}
}
if(!sign) {
//如果出现没有比较一次的情况则表示数据已经有序
break;
}
a++;//轮数加1
}
System.out.println("共"+a+"轮数");
System.out.println("交换次数:"+b);
}
//输出数组的元素
public static void output(int[] datas) {
for (int i = 0; i < datas.length; i++) {
System.out.println(datas[i]);
}
}
}