排序:冒泡、插入、选择

image.png

知识点:

1、原地排序 : 空间复杂度为O(1)
2、稳定性:如果待排序的序列中存在值相等的元素,经过排序后,相等元素之间的原有先后顺序不变

冒泡排序:

image.png

冒泡排序就是遍历数组,将大的元素像是气泡一样往上冒,第一次冒泡之后最大元素冒到数组最后的一位,每一次冒泡都会有一个元素找到自己的位置。

优化:不需要冒n次泡才找排好,如果出现没有数据交换的情况,就可以提前退出排序。

 /**
     * 冒泡排序 a表示数组
     */
    public void bubbleSort(int[] a){

        //数组大小
        int n = a.length;
        if (n <= 1 ) return;

        for (int i = 0 ; i  < n ; i++){
            boolean flag = false;//用于提前退出排序
            for (int j=0 ; j < n-i-1 ; j++){
                if (a[j] > a[j+1]){
                    int temp = a[j];
                    a[j] = a[j+1];
                    a[j+1] = temp;
                    flag =true;
                }

            }
            if (!flag)//没有数据交换
                break;
        }
    }

插入排序:

将数组分为两个区域,已排序区和未排序区,初始状态下的排序区只有一个元素,即数组的第一个元素。
插入算法的实现是将从未排区域中找元素然后在已排区域找到插入的位置将其插入。重复这个过程,直到未排序区没有元素。

插入排序含有两个操作 比较和交换


image.png
  /**
     * 插入排序
     * @param a
     */
    public void insertionSort(int[] a){

        //数组大小
        int n = a.length;

        for (int i = 1 ; i < n ; i++ ){
            int j = i-1;
            int value = a[i];
            for (;j >= 0 ; j--){
                if (a[j] > value){
                    a[j+1] = a[j];
                }
                else {
                    break;
                }
            }
            a[j+1] = value;
        }

    }

选择排序

也分未排序区和已排序区,每次从未排序区中找最小的元素,然后放到已排序区末尾。


image.png
 /**
     * 选择排序
     * @param a
     */
    public void selectSort(int[] a){
        int n = a.length;//数组大小

        for (int i = 0 ; i < n ; i++){
            int min = a[i];
            int index = -1;
            for (int j = i+1; j < n ; j++){
                if (min > a[j]){
                    min = a[j];
                    index = j;
                }
            }
            if (index != -1) {
                int temp = a[i];
                a[i] = min;
                a[index] = temp;
            }
        }
    }

总结:

这三种排序都是原地排序,平均时间复杂度都为O(n^2),插入排序优于冒泡排序,因为在交换元素时,冒泡有三个赋值语句,而插入只有一个。

你可能感兴趣的:(排序:冒泡、插入、选择)