# Bubble Sort Demo
**Repository Path**: mrfu/bubble-sort-demo
## Basic Information
- **Project Name**: Bubble Sort Demo
- **Description**: 冒泡排序总结
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-07-20
- **Last Updated**: 2021-07-21
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Bubble Sort Demo
#### 冒泡排序总结
冒泡排序 Bubble Sort, 是一种基础的 **[交换排序]**
#### 交换思想:
把相邻的两个元素两两比较,当一个元素大于右侧元素时,交换它们的位置;
当一个元素小于或等于右侧元素时,位置不变。
冒泡排序是一种稳定的排序,值相等的元素并不会打乱原本的顺序。
由于该排序算法的每一轮都要遍历所有元素,总遍历(元素数量 - 1)轮,所以平均时间复杂度是 O(n²)
#### 方法说明
1. sort1(int[]) ==> 原始冒泡排序方法
把相邻的两个元素两两比较,当一个元素大于右侧元素时,交换它们的位置;当一个元素小于或等于右侧元素时,位置不变。
每一轮都要遍历所有元素,总遍历(元素数量 - 1)轮,所以平均时间复杂度是 O(n²)
2. sort2(int[]) ==> 冒泡排序优化
定义一个标记 isSorted = true,表示该轮数组已是一个有序数组
在排序比较过程中,只要出现一次相邻的两个元素发生位置交换,则说明数组是无序的,做出标记 isSorted = false;
反之,在该轮比较过程中,无相邻的两个元素交换位置,则说明此时数组已是有序的,
则做出标记 isSorted = true,剩下几轮排序比较则不必继续执行(跳出循环)
3. sort3(int[]) ==> 冒泡排序优化
定义一个标记 isSorted = true,表示该轮数组已是一个有序数组
在排序比较过程中,只要出现一次相邻的两个元素发生位置交换,则说明数组是无序的,做出标记 isSorted = false;
反之,在该轮比较过程中,无相邻的两个元素交换位置,则说明此时数组已是有序的,
记录最后一次交换元素的位置,作为无序数组的边界,每一轮比较只需要比到这个边界位置即可
情况一:没有元素进行位置交换,证明已经有序,排序结束。
情况二:无序数组边界为 0 时,说明数组已然有序,直接跳出大循环
适应于已知存在一段有序元素的数组
4. sort4(int[]) ==> 鸡尾酒排序
双向排序,元素的比较和交换操作是双向的
排序过程像钟摆一样,每一轮从左到右一次,再从右到左一次,没有元素进行位置交换,证明已经有序,排序结束。
5. sort5(int[]) ==> 鸡尾酒排序优化
双向排序,元素的比较和交换操作是双向的
排序过程像钟摆一样,每一轮从左到右一次,记录最后一次交换元素的位置,作为无序数组的边界 sortBorderRight,每一轮比较只需要比到这个边界位置即可;
再从右到左一次,记录最后一次交换元素的位置,作为无序数组的边界 sortBorderLeft,每一轮比较只需要比到这个边界位置即可
情况一:没有元素进行位置交换,证明已经有序,排序结束。
情况二:无序数组边界为 sortBorderRight == sortBorderLeft 时,说明数组已然有序,直接跳出大循环
6. swap(int[], int, int) ==> 交换数组中指定位置上的元素
备注: System.out.print 语句只是为了在控制台描述交换过程