基本排序_冒泡排序_Java实现

来源:互联网 发布:网络接口都有哪些 编辑:程序博客网 时间:2024/04/26 20:43

转载请注明出处:http://blog.csdn.net/ljmingcom304/article/details/50341295
本文出自:【梁敬明的博客】

1.冒泡排序

  冒泡排序就是重复的按照特定的顺序比较两两元素的大小,交换它们,直到最后没有可以交换的元素为止。

冒泡排序
 
  如上图所示,假设一个序列的初始状态为【9】【8】【7】【6】【5】,将序列由小到大进行排序,每次进行排序时从后往前依次比较两个数的大小,将较小的数前置。
  第一次排序,找到最小的数为5,将其排在序列的第1位。
  第二次排序,找到最小的数为6,将其排在序列的第2位。
  第三次排序,找到最小的数为7,将其排在序列的第3位。
  第四次排序,找到最小的数为8,将其排在序列的第4位。
  只剩最后一个数,不用再次进行比较,直接位于序列最后。

2.示例代码

  假设对一个长度为N的序列由小到大进行排序,第i次排序,需要找到最小的数为m,将其排在序列的第i位,当最终完成排序后需要进行N-1次排序。
  当进行第i次排序时,需要从N与N-1开始从后往前两两元素进行比较,直到比较到第i位为止。
   当元素间进行两两比较时,位置不在发生变换,说明此时序列为有序序列,可以直接结束循环。

public class BubbleSort {    public static void main(String[] args) {        int[] array = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };        BubbleSort.sort(array);        System.out.println("排序后数组:" + Arrays.toString(array));    }    public static void sort(int[] a) {        // 用于标志排序过程中元素是否发生交换        boolean flag = false;        for (int i = 0; i < a.length - 1; i++) {            // 从后向前遍历依次比较相邻两数大小,将较小的数进行前置            for (int j = a.length - 1; j > i; j--) {                if (a[j - 1] > a[j]) {                    a[j] = a[j - 1] + a[j];                    a[j - 1] = a[j] - a[j - 1];                    a[j] = a[j] - a[j - 1];                    flag = true;                }            }            // 若某一轮没有发生交换,说明是有序数列,直接跳出循环            if (flag == false)                break;            System.out.println(Arrays.toString(a));        }    }}

3.算法分析

时间复杂度:
  若序列的初始状态处于正序,遍历一次,不需要交换元素间的位置,即可完成排序,所以比较次数和移动次数均为最小值。比较次数Cmin=n1,移动次数Mmin=0,所以冒泡排序的最好时间复杂度为O(n)
  若序列的初始状态为倒序,需要进行n-1次排序,每次排序都需要进行n-i次的比较,都需要移动记录三次来交换元素位置,所以比较次数和移动次数均为最大值。比较次数Cmax=n(n1)2=O(n2),移动次数Mmax=3n(n1)2=O(n2),所以冒泡排序的最坏时间复杂度为O(n2)
  因此,冒泡排序总的时间复杂度为O(n2)
算法稳定性:
  冒牌排序是比较相邻的两个元素,交换也发生在两个元素之间,若两个元素相等,不会发生交换,相同元素的顺序不会发生改变。因此,冒泡排序是一种稳定的排序算法。

0 0