数据结构与算法系列——排序(8.1)_冒泡排序

1. 工做原理(定义)

  核心思想:冒泡排序是一种典型的 交换排序 ,经过比较相邻元素大小来决定是否交换位置html

  冒泡排序的思想:不停地比较相邻的两个记录,若是相邻的两个记录的次序是反序则交换,直到全部的记录都已经排好序了(使关键字最小或最大的记录如气泡通常逐渐往上“漂浮”直至“水面”,因此叫冒泡排序)。git

2. 算法步骤

  1. 比较相邻的元素。若是第一个比第二个大,就交换他们两个。github

  2. 对每一对相邻元素做一样的工做,从开始第一对到结尾的最后一对。这步作完后,最后的元素会是最大的数。算法

  3. 针对全部的元素重复以上的步骤,除了最后一个。数据结构

  4. 持续每次对愈来愈少的元素重复上面的步骤,直到没有任何一对数字须要比较。

  

 

3. 动画演示

4. 性能分析

1. 时间复杂度

  (1)顺序排列时,冒泡排序总的比较次数为n-1(比较一轮后就跳出循环),移动次数为0; 
  (2)逆序排序时,冒泡排序总的比较次数为n(n-1)/2,移动次数为n(n-1)/2次; 
  (3)当原始序列杂乱无序时,平均时间复杂度为O(n^2)。函数

  若文件的初始状态是正序的,一趟扫描便可完成排序。所需的关键字比较次数   和记录移动次数   均达到最小值:   ,   。因此,冒泡排序最好的时间复杂度为   。
  若初始文件是反序的,须要进行  趟排序。每趟排序要进行  次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种状况下,比较和移动次数均达到最大值:  。冒泡排序的最坏时间复杂度为  。综上,所以冒泡排序总的平均时间复杂度为  

2. 空间复杂度

  冒泡排序排序过程当中,Swap函数须要一个临时变量temp进行两两交换,所须要的额外空间为1,所以空间复杂度为O(1)。性能

3. 算法稳定性 

  冒泡排序在排序过程当中,元素两两交换时,相同元素的先后顺序并无改变,因此冒泡排序是一种稳定排序算法。学习

4. 初始顺序状态

  1. 比较次数:
  2. 移动次数:
  3. 复杂度:    
  4. 排序趟数:

5. 归位

  能归位,每一趟排序有一个元素归位。动画

6. 优势

6. 改进算法

  1. 对因而否已是有序排列进行判断;
  2. 对已经排序好的元素不参与重复的比较。

7. 具体代码

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; }

 

8. 参考网址

  1. 数据结构基础学习笔记目录
  2. 75-交换排序——冒泡排序
  3. 排序算法系列之冒泡排序
  4. https://visualgo.net/en/sorting
  5. https://www.runoob.com/w3cnote/bubble-sort.html
  6. https://github.com/hustcc/JS-Sorting-Algorithm
  7. 冒泡排序
相关文章
相关标签/搜索