常用排序算法-冒泡排序

介绍

  冒泡排序算法是一种简单的排序算法,它在重复的访问要排序的元素时,会依次比较相邻的两个元素,以升序为例,如果左边的元素大于右边的元素,就交换两个元素的位置,如此重复,直到没有相邻的元素需要交换位置,则排序完毕。

  在排序的过程中,每一轮交换都会将最大的元素移动到数组的末端(升序),如同气泡上浮一般,所以称之为冒泡排序。

原理

  下表是对[4,5,6,3,2,1]进行冒泡排序,每次都将当前数据和下一个数据进行比较,以升序为例,如果当前数据比下一个数据大,则交换两个数据的位置,否则不做任何处理。通过第一趟排序将最大值6放置在最后一个位置,第二趟将5放置在倒数第二个位置,依次类推,直到所有的数据都排序完成。

初始 4 5 6 3 2 1
第1趟 4 5 3 2 1 6
第2趟 4 3 2 1 5 6
第3趟 3 2 1 4 5 6
第4趟 2 1 3 4 5 6
第5趟 1 2 3 4 5 6

程序

public class BubbleSort {
    public static void bubbleSort(int [] arr){
        for(int i = 0; i < arr.length - 1; ++i){
            for(int j = 0; j < arr.length - i - 1; ++j){
                if(arr[j] > arr[j + 1])
                    swap(arr, j, j + 1);
            }
        }
    }
    private static void swap(int[] arr, int i, int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

总结

  冒泡排序的时间复杂度最差为O(n^2),最好情况时O(n),平均时间复杂度为O(n^2)。

  同时冒泡排序是在原数组上直接进行操作,空间复杂度是O(1)。

  由于元素的排序是相邻两元素交换得到的,所以冒泡排序是稳定的。

  小优化:对于如[1,2,3,4,5,6]这种已经排序好了的数组,我们可以设置一个标志位,用来判断本轮排序是否对元素进行了交换,如果没有交换,表示此时剩下的元素已经排好序了,直接返回即可,这也就是冒泡排序最好的情况。

posted @ 2020-04-21 22:42  silentteller  阅读(181)  评论(0编辑  收藏  举报