【排序算法】冒泡排序

xiaoxiao2021-02-28  104

1.冒泡排序的定义

冒泡排序( Bubble Sort) 一种交换排序,两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。

2.冒泡排序的流程

比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个。

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

实例:

分析:

无序序列 { 4. 3. 1. 2, 5 }

第一趟排序:通过两两比较,找到第一小的数值 1 ,将其放在序列的第一位。

第二趟排序:通过两两比较,找到第二小的数值 2 ,将其放在序列的第二位。

第三趟排序:通过两两比较,找到第三小的数值 3 ,将其放在序列的第三位。

排序结束。

3.冒泡排序的代码实现

public class BubbleSort { public static void bubbleSort(int[] array) { for (int i = 0; i < array.length - 1; i++) { for (int j = 0; j < array.length - i - 1; j++) { if (array[j] > array[j + 1]) { int temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; } } } } public static void main(String[] args) { int[] array = {5, 9, 3, 8, 4, 6, 7}; bubbleSort(array); System.out.println("排序后的的数组(升序):" + Arrays.toString(array)); } }

输出结果

排序后的的数组(升序):[3, 4, 5, 6, 7, 8, 9]

4.算法分析

(1)冒泡排序算法的性能

(2)时间复杂度

若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数C和记录移动次数M均达到最小值,冒泡排序最好时间复杂度为O(N)。

若初始文件是反序的,需要进行 N -1 趟排序。每趟排序要进行 N - i 次关键字的比较(1 ≤ i ≤ N - 1),冒泡排序的最坏时间复杂度为O(N2)。

因此,冒泡排序的平均时间复杂度为O(N2)。

当数据越接近正序时,冒泡排序性能越好。

(3)算法稳定性

冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间,所以相同元素的前后顺序并没有改变,冒泡排序是稳定的。

5.优化

加入标志性变量flag,用于标志某一趟排序过程中是否有数据交换,若无数据交换,则说明所有数据已经有序,可立即结束排序,避免不必要的比较过程。优化后的冒泡排序: public static void bubbleSort2(int[] array) { for (int i = 0; i < array.length - 1; i++) { boolean flag = false; for (int j = 0; j < array.length - i - 1; j++) { if (array[j] > array[j + 1]) { int temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; flag = true; } } // 若无数据交换,说明数组已经有序 if (!flag) { break; } } }

本人才疏学浅,若有错,请指出 谢谢!

转载请注明原文地址: https://www.6miu.com/read-80048.html

最新回复(0)