排序算法——BAT必考

六種思路:(純自己實現,有bug歡迎提醒)圖解排序算法

  1. 狗熊掰玉米法(冒泡法)

需求是幾根玉米從短到長排列。
狗熊先拿起第一個放在手中,去跟第二個比,如果大于第二個,就比較第三個,否則就放下第一個,拿起第二個,直到比較了所有,這是,手中的肯定是最大的,并把它放在最后。以此類推。

    //冒泡函數:
    function bubble(arr){
        for (let n=0; n< arr.length-1; n++){
            for(let m=0; m<arr.length-n-1;m++){
                if(arr[m]>arr[m+1]){
                    conversion(arr,m,m+1)
                }
            }
        }
        return arr;
    }
    //交換函數:
    function swap(array,po1,po2){
        let po = array[po1];
        array[po1] = array[po2];
        array[po2] = po;
    }
  1. 教官排位置法(選擇排序法)

需求是幾個人從小到大站隊。
教官先找最小的放在第一位,于是,記住現在第一個人的身高去跟后面的每一個比個,一旦發現有更矮的,就記住這個更矮的,繼續比,直到找到最矮,并把最矮的和第一位的人換位置,以此類推。

    //選擇排序法:
    let array1 = [2,34,2,3,5,256,7,4,23,2,34,213,12,4125,6];
    function selectionSort(arr){
        for(let n=0; n<arr.length-1; n++){
            let min = arr[n];
            let idx = n;

            for(let m=n+1; m<arr.length+n; m++){
                if(min>arr[m]){
                    min = arr[m];
                    idx = m;
                }
            }
            swap(arr,n,idx);
        }
        return arr;
    }
    //交換函數:
    function swap(array,a1,a2){
        var a = array[a1];
        array[a1] = array[a2];
        array[a2] = a;
        return array;
    }
    console.log(array1)
    console.log(selectionSort(array1));
  1. 摸牌法(插入法)

需求是牌從小到大排列。
開始摸牌,第二張和第一張比,如果大于第一張,就放在后面,否則放前面。摸第三張牌,往前找,如果出現比自己小,就放在這張牌后面。以此類推。
我的方法:

    let array1 = [2,34,2,3,5,256,7,4,23,2,34,213,12,4125,6];

    //摸牌法
    function insertionSort(arr){
        for(let i=1; i<arr.length; i++){
            for(let j=0; j<i; j++){
                if(arr[i]<arr[j]){
                    swap(arr,i,j);
                }
            }
        }
        return arr;
    }
   //交換函數:
    function swap(array,a1,a2){
        var a = array[a1];
        array[a1] = array[a2];
        array[a2] = a;
        return array;
    }
    console.log(array1)
    console.log(insertionSort(array1));

網上某大神的方法:(甚為精妙)

    function insertionSort(arr){
        let value,
            j,
            i;
        for(i=0;i<arr.length;i++){
            value = arr[i];
            for(j=i-1; j> -1 && arr[j]>value;j--){
                arr[j+1] = arr[j];
            }
            arr[j+1] = value;
        }
        return arr;
    }
  1. 領導分配任務法——遞歸(不會)

需求是將任務從小到大排列。
拿到任務,大領導將任務分給兩個主管,每個主管又將自己的任務分給下屬,層層分配,最后一級將拿到的兩個任務大小進行排序,他的上級同樣操作,以此類推。

  1. 快速排序——自私算法(不會)

需求是從大到小排序。
第一個不考慮其他人排序,而是只考慮自己的位置。即我只要找一個位置,這個位置滿足前面的都比我小,后面的都比我大,那這個位置就是我的正確位置。以此類推。

  1. 隨機算法——解決自私算法bug(同側為同小或同大時)(不會)

道理同上,只不過這次不是按照順序,從第一個開始,依次往下,而是隨機的抽取一個,然后去找自己的位置。
這樣做可以解決同一側都是比自己大或小的情況,節省時間。

  1. 桶排法

在排序之前,我先準備幾個桶(桶順序從小到大),然后把相同高度的放在一個桶里,不同高度放在響應的桶里。放好之后在按照桶的順序一個個拿出來。

  1. 基數排法

每一位進行比較,放在桶里,在按照從小到大順序拿出,以此類推。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 概述 排序有內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部...
    蟻前閱讀 5,220評論 0 52
  • 概述:排序有內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,743評論 0 15
  • 概述排序有內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部的...
    Luc_閱讀 2,299評論 0 35
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個記錄插入到已排序好...
    依依玖玥閱讀 1,282評論 0 2
  • 1對我來說,勝利帶給我最好的禮物是內心的平靜,不必再為事物痛恨自己,不必反復折磨自己。——網球運動員,李娜 如果說...
    知魚君閱讀 561評論 0 1