学习任务:

视频学习冒泡排序

动手编写冒泡排序程序

动手优化冒泡排序程序

分析:

根据上边对冒泡排序过程的分析,对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]);
		}
    }
    
}

提问-攀博课堂
我要提问 不会就问,有效沟通
关注公众号,加入微信群交流提问。 攀博课堂官方公众号
问答列表,查看本知识点所有问题