基本排序方法归纳整理(一):冒泡排序

来源:互联网 发布:mysql防止高并发 编辑:程序博客网 时间:2024/06/08 06:21

注:文章内容整理自《Data Structures and Algorithm Analysis in Java (Second Edition)》——Mark Allen Weiss
内部排序(internal sorting):在主存中即可完成的排序;
外部排序(external sorting):不能在主存中完成,必须借助外存(磁盘)
1、常见内部排序有7种:冒泡排序,插入排序,选择排序,希尔排序,堆排序,归并排序,快速排序
2、时间复杂度在O(N^2)的排序方法是冒泡排序,插入排序和选择排序;
“通过交换相邻元素进行排序的任何算法平均时间都需要O(N^2)”——书中定理7.2
时间复杂度比O(N^2)略优的排序算法希尔排序,恰恰是突破了定理7.2的限制才得以实现的,具体时间复杂度一句所选增量有较大变化,一般认为若增量序列选择合适(如Hibbard增量),希尔排序最坏时间复杂度为O(N^(3/2)),平均复杂度在O(N^(5/4)),若选择不合适,依然是O(N^2)
堆排序,归并排序,快速排序属于较快的排序方法,平均时间复杂度为O(NlogN)

(一)冒泡排序

  1. 冒泡排序简介
    冒泡排序是最简单易懂的排序法,“冒泡”的由来就是自下向上,每次都将一个最小(或最大)元素升到最上端位置,就像水中“冒泡”一样(此节书中没有,个人整理)。
  2. 一趟冒泡:
    示意图如下:
    这里写图片描述
    一趟排序中,逐个遍历,相邻元素判断是否交换(图中红色的代表是已发生过交换的数),最终在顶部“冒泡”出一个排序值(绿色),一趟排序只能定一个值,若要全部排序,则需要n趟冒泡,由于每趟需要比较n-1次,故最终时间复杂度为O(N^2)
  3. 冒泡排序(n趟冒泡)
    示意图如下:
    这里写图片描述
  4. java代码实现
public class BubbleSorting {    /*     * 1、每冒泡一趟,就将最大的元素放置到数组末尾(默认从小到大排序),一趟定出一个元素的位置     * 2、通过相邻元素(j与j+1)的比较,判断是否需要交换位置,将较大的放置到j+1的位置上,然后比较下一个相邻对     * 3、冒泡一趟定出一个较大值,下次冒泡时就仅需要比较剩余较小的值即可,即每次比较的总数会递减     * @param arr -->被排序数组     * @param     */    public static void bubbleSort(int[] arr){        if(arr==null || arr.length==0){            return ;        }        for(int i=arr.length-1; i>0; i--){      //i计数当前需要进行排序的个数            for(int j=0; j<i; j++){             //j计数本次一趟冒泡中的下标计数                if(arr[j]>arr[j+1]){            //相邻对比较中,前者比后者大,则交换                    int temp = arr[j];                    arr[j] = arr[j+1];                    arr[j+1] = temp;                }            }        }    }    public static void main(String[] args){//      BubbleSorting bubble = new BubbleSorting();        int[] arr1 = {};        int[] arr2 = {5,7,3,8,2,9,4,5,5,3,6,8,8,2,1};        int[] arr3 = null;        int[] arr4 = {9,8,7,6,5,4,3,2,1};        bubbleSort(arr1);        bubbleSort(arr2);        bubbleSort(arr3);        bubbleSort(arr4);        System.out.println("arr1:"+Arrays.toString(arr1));        System.out.println("arr2:"+Arrays.toString(arr2));        System.out.println("arr3:"+Arrays.toString(arr3));        System.out.println("arr4:"+Arrays.toString(arr4));    }}

显示结果为:

arr1:[]arr2:[1, 2, 2, 3, 3, 4, 5, 5, 5, 6, 7, 8, 8, 8, 9]arr3:nullarr4:[1, 2, 3, 4, 5, 6, 7, 8, 9]
  1. 总结
    冒泡排序为O(N^2)算法,稳定排序