真正的Java数据结构之冒泡排序算法
今天之前上网搜Java冒泡排序算法,看到很多都是错误的,所以自己就根据书上实现了一下:
/** * 测试冒泡排序 * @author vincent * */ public class Maopao{ //main方法 public static void main(String[] args) { //定义要排序的数组数据 int[] data = { 1, 5, 3, 54, 61 }; //排序前输出 printArray(data); //进行排序 int[] data1 = bubbleSort(data); //排序后输出 printArray(data1); } /** * <h4>冒泡排序(降序)</h4> * * @param array * 要进行排序的int数组 */ public static int[] bubbleSort(int[] array) { //定义临时变量,负责交换时的临时数据 int temp; //这一层循环是指每次都进行重新的、从头的判断交换排序 for (int i = 0 ; i < array.length; i++) { //这里for的条件【j < array.length - 1】这样做是为了防止下面的判断出现[数组越界异常]! for (int j = 0; j < array.length - 1; j++) { //如果数组元素的当前(从第一个开始)值小于后一个元素的值 if (array[j] > array[j + 1]) { //进行数据交换 temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; } } } return array; } /** * 输出数组元素 * @param obj 要输出的数组 */ public static void printArray(int[] array) { for (int i = 0; i < array.length; i++) { System.out.print(array[i] + " "); } System.out.println(); } }
程序运行流程,
未排序时:
[1, 5, 3, 54, 61]
第一次排序结果:
[5, 3, 54, 61, 1]
第二次排序结果:
[5, 54, 61, 3, 1]
第三次排序结果:
[54 , 61, 5, 3, 1]
第四次排序结果:
[61, 54, 5, 3, 1]
温馨提示!这样的遍历并不是最佳的方式,因为每次都从头开始到结尾排序。效率较低(虽然说冒泡本来就效率低),我们可以考虑一下,既然每次都把最小的数据(或者最大的数据)排到最后一个,那么我们完全可以这样做,里面的每次比较只比较除了后一位的前面数据,文字比较绕口,看图看代码:
图片如下:
代码:
/** * <h4>修改后的冒泡排序(降序)</h4> * * @param array * 要进行排序的int数组 */ public static int[] bubbleSort(int[] array) { //定义临时变量,负责交换时的临时数据 int temp; //这一层循环是指每次都进行重新的、从头的判断交换排序,但每次都比上一次少一次比较(最后两个不做比较) for (int i = array.length - 1 ; i > 0; i--) { //这里的for的条件[j < i],因为每执行上面的for一次,i都会减1, //所以不会进行与第一次排序后的数组的最后一个数据进行比较, //比如:当i=3时,j<3,所以下面的这个for只遍历三次,即前面四个数据的两两比较。 for (int j = 0; j < i; j++) { //如果数组元素的当前(从第一个开始)值小于后一个元素的值 if (array[j] < array[j + 1]) { //进行数据交换 temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; } } } return array; }
特别说明:个人学习心得,望各位大神些批评指教!谢谢。