排序:為什么插入排序比冒泡排序更受歡迎

經(jīng)典排序有以下幾種:

O(n2):冒泡排序、插入排序、選擇排序 基于比較
O(nlogn):歸并排序、快速排序 基于比較
O(n):捅排序、計(jì)數(shù)排序、基數(shù)排序

如何分析排序算法

1,最好時(shí)間復(fù)雜度,最壞時(shí)間復(fù)雜度,平均時(shí)間復(fù)雜度
2,時(shí)間復(fù)雜度的系數(shù),常數(shù),低階
3,比較次數(shù)和交換次數(shù)
排序算法內(nèi)存消耗
排序算法穩(wěn)定性

冒泡排序

    public static void sort(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    Utils.exchange(arr, j, j + 1);
                }
            }
        }
    }

可以優(yōu)化如果沒有交換跳出循環(huán)

    public static void sort2(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            boolean flag = false;//提前退出排序標(biāo)志
            for (int j = 0; j < arr.length - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    Utils.exchange(arr, j, j + 1);
                    flag = true;//表示有數(shù)據(jù)交換
                }
            }
            if (!flag)//沒有數(shù)據(jù)交換提前退出
                break;
        }
    }

冒泡排序性能分析

是原地排序算法么?

冒泡排序只涉及到相鄰兩個(gè)元素交換,空間復(fù)雜度是O(1),所有是原地排序

是穩(wěn)定排序算法么?

冒泡排序中只有比較才會(huì)交換順序,所以我們控制在相等時(shí)不交換元素順序即可,所以冒泡排序是穩(wěn)定排序算法

時(shí)間復(fù)雜度是多少?

最好的情況下數(shù)據(jù)為有序,我們只需要進(jìn)行一次冒泡即可,時(shí)間復(fù)雜度為O(n)
最壞的情況下數(shù)據(jù)為倒序,我們需要進(jìn)行n次冒泡操作,時(shí)間復(fù)雜度為O(n2)
平均時(shí)間復(fù)雜度為O(n2)

插入排序

    public static void sort(int[] arr) {
        for (int i = 1; i < arr.length; i++) {
            int value = arr[i];
            int j = i - 1;
            //查找插入位置
            for (; j >= 0; j--) {
                if (arr[j] > value) {
                    arr[j + 1] = arr[j];
                } else {
                    break;
                }
            }
            arr[j+1] = value;//插入數(shù)據(jù)
        }
    }

插入排序性能分析

是原地排序算法么?

空間復(fù)雜度是O(1),是原地排序

是穩(wěn)定排序算法么?

對(duì)于相同的值,我們可以把后面出現(xiàn)的元素插入到之前出現(xiàn)元素的后面,所以是穩(wěn)定排序算法

時(shí)間復(fù)雜度是多少?

最好的情況下數(shù)據(jù)為有序,我們只需要遍歷一次,時(shí)間復(fù)雜度為O(n)
最壞的情況下數(shù)據(jù)為倒序,相當(dāng)于每次都是在數(shù)組的第一個(gè)位置插入元素,時(shí)間復(fù)雜度為O(n2)
平均時(shí)間復(fù)雜度為O(n2)

選擇排序

    //選擇排序:從待數(shù)組中選擇出一個(gè)最小放入排序數(shù)組中以此類推
    public static void sort(int[] arr) {
        int minIndex;
        for (int i = 0; i < arr.length; i++) {
            minIndex = i;
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[j] < arr[minIndex]) {
                    minIndex = j;
                }
            }
            Utils.exchange(arr, i, minIndex);
        }
    }

選擇排序性能分析

是原地排序算法么?

空間復(fù)雜度是O(1),是原地排序

是穩(wěn)定排序算法么?

不是穩(wěn)定的排序算法

時(shí)間復(fù)雜度是多少?

最好的情況下數(shù)據(jù)為有序,復(fù)雜度為O(n2)
最壞的情況下數(shù)據(jù)為倒序,復(fù)雜度為O(n2)
平均時(shí)間復(fù)雜度為O(n2)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 有句話說,世上沒有丑女人只有懶女人。我想我可能是個(gè)假女人,因?yàn)槲也粌H丑,還懶。我說自己丑不是對(duì)自己不自信而是我有自...
    邵子初閱讀 364評(píng)論 0 0
  • 其實(shí)每個(gè)人都有青春萌動(dòng),有過為愛逐千里,或許并不是每個(gè)人都有那份幸運(yùn)——你喜歡的人剛好也喜歡你,沒有轟轟烈烈的愛情...
    陳無知閱讀 456評(píng)論 0 1

友情鏈接更多精彩內(nèi)容