电脑
myeclipse
用二重循环实现,外循环变量设为i,内循环变量设为j。假如有n个数需要进行排序,则外循环重复n-1次,内循环依次重复n-1,n-2,...,1次。每次进行比较的两个元素都是与内循环j有关的,它们可以分别用a[j]和a[j+1]标识,i的值依次为1,2,...,n-1,对于每一个i,j的值依次为0,1,2,...n-i 。代码如下所示:import java.util.Arrays; public class Test { public static void arraySort(int[] arr) { int temp;// 定义一个临时变量 for (int i = 0; i < arr.length - 1; i++) {// 冒泡趟数 for (int j = 0; j < arr.length - i - 1; j++) { if (arr[j + 1] < arr[j]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } public static void main(String[] args) { int arr[] = new int[] { 9, 6, 3, 2, 3, 4 }; arraySort(arr); System.out.println(Arrays.toString(arr)); }}
性能分析(执行效率分析):若记录序列的初始状态为'正序',则冒泡排序过程只需进行一趟排序,在排序过程中只需进行n-1次比较,且不移动记录;反之,若记录序列的初始状态为'逆序',则需进行n(n-1)/2次比较和记录移动。因此冒泡排序总的时间复杂度为O(n*n)。
性能优化冒泡排序1、举个例子:int[] array = {2,4,9,7,6,5};第一轮2和4进行比较,2<4,位置不变。再4和9进行比较,4<9,位置不变。再9和7进行比较,9>7,9和7的位置互换。再9和6进行比较,9>6,9和6的位置互换。再9和5进行比较,9>5,位置互换。第一轮比较的结果就是2 4 7 6 5 9。第二轮2和4进行比较,2<4,位置不变。再4和7进行比较,4<7,位置不变。再7和5进行比较,7>6,7和6的位置互换。再7和5进行比较,7>5,7和5的位置互换。第二轮的结果就是2 4 6 5 7 9。第三轮2和4进行比较,2<4,位置不变。再4和6进行比较,4<6,位置不变。再6和5进行比较,6>5,6和5的位置互换。第三轮的结果是2 4 5 6 7 9(已经是我们想要的结果了)。2、具体代码如下所示:import java.util.Arrays; public class Test { public static void arraySort(int[] arr) { int temp;// 定义一个临时变量 for (int i = 0; i < arr.length - 1; i++) {// 冒泡趟数,n-1趟 boolean flag = true; for (int j = 0; j < arr.length - i - 1; j++) { if (arr[j + 1] < arr[j]) { flag = false; temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } // 如果当轮没有发生位置变化,说明已经排序完毕,就没有必要再进行循环了 if (flag) { break; } } } public static void main(String[] args) { int arr[] = new int[] { 2, 4, 9, 7, 6, 5 }; arraySort(arr); System.out.println(Arrays.toString(arr)); }}
前面我们说了一下简单的基本数据类型的排序。下面我们解决一个实体的多条件排序。加入有一个圆柱实体类:Column 现在我们需要根据其半径radius从小到大排序,如果半径一致,则按照高h从小到大排序。
实体类:Column public class Column implements Comparable
测试类如下:public class ColumnTest { public static void main(String[] args) { Column co1 = new Column(5, 3); Column co2 = new Column(2, 4); Column co3 = new Column(4, 3); Column co4 = new Column(2, 3); Column co5 = new Column(4, 6); Column[] arry = { co1, co2, co3, co4, co5 }; testArraySort(arry); } private static void testArraySort(Column[] arry) { Column cnj; // 使用冒泡排序 for (int i = 0; i < arry.length - 1; i++) { for (int j = 0; j < arry.length - 1 - i; j++) { cnj = arry[j]; if (arry[j + 1].getRadius() < cnj.getRadius() || (cnj.getRadius() == arry[j + 1].getRadius() && arry[j + 1].getH() < cnj.getH())) { arry[j] = arry[j + 1]; arry[j + 1] = cnj; } } } // 打印输出 for (int i = 0; i < arry.length; i++) { System.out.print('(' + arry[i].getRadius() + ',' + arry[i].getH() + ') '); } } }
效率提升使用优化后的方式:package com.sgg.test; public class ColumnTest { public static void main(String[] args) { Column co1 = new Column(5, 3); Column co2 = new Column(2, 4); Column co3 = new Column(4, 3); Column co4 = new Column(2, 3); Column co5 = new Column(4, 6); Column[] arry = { co1, co2, co3, co4, co5 }; testArraySort(arry); } private static void testArraySort(Column[] arry) { Column cnj; // 使用冒泡排序 for (int i = 0; i < arry.length - 1; i++) { boolean flag = true; for (int j = 0; j < arry.length - 1 - i; j++) { cnj = arry[j]; if (arry[j + 1].getRadius() < cnj.getRadius() || (cnj.getRadius() == arry[j + 1].getRadius() && arry[j + 1].getH() < cnj.getH())) { flag = false; arry[j] = arry[j + 1]; arry[j + 1] = cnj; } } // 如果当轮没有发生位置变化,说明已经排序完毕,就没有必要再进行循环了 if (flag) { break; } } // 打印输出 for (int i = 0; i < arry.length; i++) { System.out.print('(' + arry[i].getRadius() + ',' + arry[i].getH() + ') '); } } }
如果有需要补充的地方,欢迎万能的网友留言!