一,冒泡排序的基本思想
①通过对待排序序列从前往后,一次比较相邻元素的值,如发现逆序则交换,使得值较大的元素逐渐从前往后移动,就像
水底的气泡一样.
②因为排序过程中,各个元素不断接近自己的位置,如果一趟下来没有进行过交换,就说明序列有序了,这是就可以考虑终
止继续比较下去了,可以设置一个标志位进行判断结束.
二例子图示
三,代码实现
Ⅰ,根据冒泡排序的思想一步一步实现
/** * 第一版 每次定义中间变量 * @param arr */ public static void bubbleSort(int[] arr){ // 原则:两两数据进行比较 // 第一趟求出最大的 // 第二趟求出第二大的 //... // 最后一趟求出倒数第二大的 for(int i=0;i<arr.length;i++){ for(int j=0;j<arr.length-1-i;j++){ if(arr[j]>arr[j+1]){ int temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } }
Ⅱ,通过数学的思想,发现两个数进行交换不用声明第三个变量
/** * 第二版 不用中间变量 * @param arr */ public static void bubbleSort1(int []arr){ for(int i=0;i<arr.length-1;i++){ for(int j=0;j<arr.length-1-i;j++){ if(arr[j]>arr[j+1]){ arr[j]=arr[j]+arr[j+1]; arr[j+1]=arr[j]-arr[j+1]; arr[j]=arr[j]-arr[j+1]; } } } }
Ⅲ,当发现没有出现两个数进行交换操作的时候,就证明此序列已经是符合要求的了
/** * 用一个标志符来控制如果没有数据进行交换就结束循环 * @param arr */ public static void bubbleSor2(int []arr){ boolean flag=false;// 定义一个标志符,如果没有进行两两交换就终止循环 for(int i=0;i<arr.length-1;i++){ for(int j=0;j<arr.length-1-i;j++){ if(arr[j]>arr[j+1]) { flag = true; arr[j] = arr[j] + arr[j + 1]; arr[j + 1] = arr[j] - arr[j + 1]; arr[j] = arr[j] - arr[j + 1]; } } if(!flag){ break; }else{ flag=false; } } }
原文:https://www.cnblogs.com/zhijm/p/13019395.html