核心思想:冒泡排序是一种典型的 交换排序 ,经过比较相邻元素大小来决定是否交换位置html
冒泡排序的思想:不停地比较相邻的两个记录,若是相邻的两个记录的次序是反序则交换,直到全部的记录都已经排好序了(使关键字最小或最大的记录如气泡通常逐渐往上“漂浮”直至“水面”,因此叫冒泡排序)。git
比较相邻的元素。若是第一个比第二个大,就交换他们两个。github
对每一对相邻元素做一样的工做,从开始第一对到结尾的最后一对。这步作完后,最后的元素会是最大的数。算法
针对全部的元素重复以上的步骤,除了最后一个。数据结构
(1)顺序排列时,冒泡排序总的比较次数为n-1(比较一轮后就跳出循环),移动次数为0;
(2)逆序排序时,冒泡排序总的比较次数为n(n-1)/2,移动次数为n(n-1)/2次;
(3)当原始序列杂乱无序时,平均时间复杂度为O(n^2)。函数
冒泡排序排序过程当中,Swap函数须要一个临时变量temp进行两两交换,所须要的额外空间为1,所以空间复杂度为O(1)。性能
冒泡排序在排序过程当中,元素两两交换时,相同元素的先后顺序并无改变,因此冒泡排序是一种稳定排序算法。学习
能归位,每一趟排序有一个元素归位。动画
public int[] bubbleSort1(int[] sourceArray) throws Exception { // 对 arr 进行拷贝,不改变参数内容
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); for (int i = 1; i < arr.length; i++) { for (int j = 0; j < arr.length - i; j++) { if (arr[j] > arr[j + 1]) {//等于就不交换,保证了稳定性 int tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; } } } return arr; } /* *设置一个标识,若是在某一趟遍历中没有发生交换,说明排序已经完成,即算法完成 */
public int[] bubbleSort2(int[] sourceArray) throws Exception { // 对 arr 进行拷贝,不改变参数内容
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); for (int i = 1; i < arr.length; i++) { // 设定一个标记,若为true,则表示这次循环没有进行交换,也就是待排序列已经有序,排序已经完成。
boolean flagChange = true; for (int j = 0; j < arr.length - i; j++) { if (arr[j] > arr[j + 1]) { int tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; flagChange = false; } } if (flagChange) { break; } } return arr; } // set flag to indicate what next step should begin from
public int[] bubbleSort3(int[] sourceArray) { // 对 arr 进行拷贝,不改变参数内容
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); int tmpNextPosition = sourceArray.length-1; for (int i = 1; i < arr.length; i++) { // 设定一个标记,若为true,则表示这次循环没有进行交换,也就是待排序列已经有序,排序已经完成。
boolean flagChange = true; int nextPosition = tmpNextPosition; for (int j = 0; j < nextPosition; j++) { if (arr[j] > arr[j + 1]) { int tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; flagChange = false; tmpNextPosition = j; } } if (flagChange) { break; } } return arr; }