1.冒泡排序:
与插入排序和选择排序的区别:
- 选择排序:遍历数组,如果当前的 index 大于 index + 1, 则互换,然后再让前面的部分进行排序
- 插入排序:以index 为起点,遍历 data.length - index ,将最大值放到最后(不是相邻两元素进行比较)
- 时间复杂度均为O(n^2)
2.冒泡排序的实现:
```java // 两元素进行交换,最后将最大值放在最后 // 进行完一次循环后,下一次循环为[0, data.length - i - 1] 区间 public void BubbleSort(E[] arr){ for(int i = 0 ; i < data.length; i++){
} }for(int j = 0 ; j < data.length - 1 - i; j++){
if(data[j] < data[j + 1]){
swap(arr, j , j + 1);
}
}
// 优化,记录交换,假如在某次遍历中一次交换都没有进行,则证明已经处于有序状态 public void BubbleSort(E[] arr){ Boolean isSwapped = true; for(int i = 0 ; i < data.length; i++){ for(int j = 0 ; j < data.length - 1 - i; j++){ if(data[j] > data[j + 1]){ swap(arr, j , j + 1); isSwapped = false; } } if(isSwapped) break; } }
// 假如最后一次交换的位置在 j 的前面, 则下一次交换的区间更改为该位置 public void BubbleSort(E[] arr){ // i 表示循环次数 for(int i = 0 ; i < arr.length;){ int swapped = 0; for(int j = 0; j < data.length - 1 -i ; j++){ if(data[j] > data[j+1]){ swap(arr, j , j + 1); swapped = j + 1; } } i = arr.length - swapped; } }
<a name="mjhqk"></a>
## 3.冒泡排序的优化:
冒泡排序实际上是减少逆序对的过程,对于部分有序的数组,冒泡排序与插入排序一样,能变成一个O(n)级别的算法。
<a name="ZhX9G"></a>
## 4.从后往前实现冒泡法
```java
public static <E extends Comparable<E>> void sort3(E[] arr) {
// 相邻元素进行交换,每次循环之后,最前面那个为最小值
// 每循环一次 ,若循环 i 次 , 下一轮循环遍历的区间为 [0,data - i - 1]
public static <E extends Comparable<E>> void sort(E[] arr) {
for (int i = 0 ; i < arr.length - 1; i++) {
for (int j = arr.length - 1; j > i ; j--) {
if (arr[j].compareTo(arr[j - 1]) < 0) {
swap(j,j - 1, arr);
}
}
}
}
}