冒泡排序作为一种交换排序方法,可以实现降序和升序。
优化:去除排序完成后的,轮数空转时间(bubblingSortx方法)
/** * 冒泡算法,用于排序: 9 8 7 6 5 4 3 2 1 比较轮数,每一轮比较次数,每一次将相邻的两个数进行比较。 第一轮: 第1次:8 9 7 6 5 4 3 2 1 2:8 7 9 6 5 4 3 2 1 3:8 7 6 9 5 4 3 2 1 4: 8 7 6 5 9 4 3 2 1 5: 8 7 6 5 4 9 3 2 1 6:8 7 6 5 4 3 9 2 1 7:8 7 6 5 4 3 2 9 1 8: 8 7 6 5 4 3 2 1 9 ①.1轮比较,获得最大数(位置固定)。 ②.N个数,比较N-1轮(因最小的数,最后一次的上一次已确定,无需再比较) ③.每轮比较次数,第i轮比较,n-i ④.思路:从开头进行排序,依次对相邻的两个元素进行比较,大的值后移(此值下次作为比较的前元素),每次确定一个比较的最大值移到最后,下一次比较的长度将减1. ⑤.规则:N个元素进行排序,总共N-1轮,第一轮比较N-1次;第二轮,比较N-2次;第i轮比较N-i次。 注:因计算机计数从0开始,所以轮数和次数都减1,也可从1开始。< "小于"其实已经减1 算法: 双层循环,外循环控制轮数,内循环控制每轮的次数 * */
代码如下(可删除,count1st和count两个多余日志参数):
package com.ts.w; /** * 冒泡排序 * @author tskk * @version 2015-6-30 11:01:54 * */ public class BubblingSort { public static void main(String[] args) { System.out.println("***排序最坏情况***"); int [] preArray = {9,8,7,6,5,4,3,2,1}; System.out.println("预比较数为:"+"9 8 7 6 5 4 3 2 1"); bubblingSort(preArray); System.out.println(); int [] preArray1 = {9,8,7,6,5,4,3,2,1}; System.out.println("预比较数为1:"+"9 8 7 6 5 4 3 2 1"); bubblingSortx(preArray1); System.out.println(); System.out.println("***排序非最坏情况***"); int [] preArray2 = {3,2,1,4,5,6,7,8,9}; System.out.println("预比较数为2:"+"3 2 1 4 5 6 7 8 9"); bubblingSort(preArray2); System.out.println(); int [] preArray3 = {3,2,1,4,5,6,7,8,9}; System.out.println("预比较数为3:"+"3 2 1 4 5 6 7 8 9"); bubblingSortx(preArray3); } public static int[] bubblingSort(int [] num){ if(num == null){ return null; } int numLen = num.length; int temp = 0; int count = 0; int count1st = 0; for(int i = 0; i < numLen - 1; i++){//比较轮数 for(int j = 0;j < numLen - i - 1; j++){ if(num[j] > num[j + 1]){//此处调整为小于,修改后,可做降序排序 temp = num[j]; num[j] = num[j + 1]; num[j + 1] = temp; count++; } } count1st++; } System.out.println("bubblingSort比较轮数为:"+count1st); System.out.println("bubblingSort比较次数为:"+count); System.out.print("bubblingSort比较结果为:"); for(int i = 0; i < numLen; i++){ System.out.print(" "+num[i]); } return num; } /** * 优化:去除排序完成后的,轮数空转时间 * */ public static int[] bubblingSortx(int [] num){ if(num == null){ return null; } int numLen = num.length; int temp = 0; int count = 0; int count1st = 0; int count2nd = 0; for(int i = 0; i < numLen - 1; i++){//比较轮数 count2nd = 0;//每轮从0开始 for(int j = 0;j < numLen - i - 1; j++){ if(num[j] > num[j + 1]){//此处调整为小于,修改后,可做降序排序 temp = num[j]; num[j] = num[j + 1]; num[j + 1] = temp; count++; count2nd++;//如果,某轮,没有交换发生(count2nd=0),说明:此时,排序已完成 } } count1st++; if(count2nd == 0){ break; } } System.out.println("bubblingSortx比较轮数为:"+count1st); System.out.println("bubblingSortx比较次数为:"+count); System.out.print("bubblingSortx比较结果为:"); for(int i = 0; i < numLen; i++){ System.out.print(" "+num[i]); } return num; } }
输出结果为:
***排序最坏情况*** 预比较数为:9 8 7 6 5 4 3 2 1 bubblingSort比较轮数为:8 bubblingSort比较次数为:36 bubblingSort比较结果为: 1 2 3 4 5 6 7 8 9 预比较数为1:9 8 7 6 5 4 3 2 1 bubblingSortx比较轮数为:8 bubblingSortx比较次数为:36 bubblingSortx比较结果为: 1 2 3 4 5 6 7 8 9 ***排序非最坏情况*** 预比较数为2:3 2 1 4 5 6 7 8 9 bubblingSort比较轮数为:8 bubblingSort比较次数为:3 bubblingSort比较结果为: 1 2 3 4 5 6 7 8 9 预比较数为3:3 2 1 4 5 6 7 8 9 bubblingSortx比较轮数为:3 bubblingSortx比较次数为:3 bubblingSortx比较结果为: 1 2 3 4 5 6 7 8 9
注:一般排序并非,最坏排序,所有,以上以节省5次空转。
优化测试演示:冒泡优化测试(1百万元素排序)