js十大排序

1.冒泡排序

 for (var i = 0; i < arr.length - 1; i++) {
        for (var j = 0; j < arr.length - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {

                var max = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = max;
            }
        }
    }
    console.log(arr);

2.選擇排序

 for (var i = 0; i < arr.length - 1; i++) {
        var min_index = i;
        for (var j = i + 1; j < arr.length; j++) {
            if (arr[j] < arr[min_index]) {
                min_index = j;
            }
        }
        var min = arr[i];
        arr[i] = arr[min_index];
        arr[min_index] = min;
    }
    console.log(arr);

3.快速排序

 var quickly = function (arr) {
        if (arr.length <= 1) {
            return arr;
        }

        // 取基準(zhǔn)值
        var cen = Math.floor(arr.length / 2);
        // 取下標(biāo)
        var cen1 = arr.splice(arr, 1)[0];

        var left = [];
        var right = [];
        for (var i = 0; i < arr.length; i++) {
            if (arr[i] < cen) {
                left.push(arr[i]);
            } else {
                right.push(arr[i]);
            }
        }
        return quickly.left.concat([cen1], quickly.right);
    }
    console.log(arr);

4.插入排序

 var sort = function (a) {
        for (var i = 1; i < arr.length; i++) {
            var w = arr[i];

            for (var j = i - 1; j >= 0 && arr[j] > w; j--) {
                arr[j + 1] = arr[j];
            }
            arr[j + 1] = w;
        }
        return a;
    }
    console.log(sort(arr));

5.歸并排序

 var sort = function (arr) {
        if (arr.length < 2) {
            return arr;
        }

        var cen = Math.floor(arr.length / 2);
        var left = arr.slice(0, cen);
        var right = arr.slice(cen);
        console.log(left, right);
        return sort1(sort(left), sort(right));
    }

    var sort1 = function (left, right) {
        var c = [];
        while (left.length > 0 && right.length > 0) {
            if (left[0] < right[0]) {
                c.push(left.shift());
            } else {
                c.push(right.shift());
            }
        }

        while (left.length > 0) {
            c.push(left.shift());
        }

        while (right.length > 0) {
            c.push(right.shift());
        }
        return c;
    }
    console.log(sort(arr));

6.堆排序

// 建立大頂堆
    function buildMaxHeap(arr) {
        len = arr.length;
        for (var i = Math.floor(len / 2); i >= 0; i--) {
            heapify(arr, i);
        }
    }

    // 堆調(diào)整
    var len; // 因為聲明的多個函數(shù)都需要數(shù)據(jù)長度戴尸,所以把len設(shè)置成為全局變量
    function buildMaxHeap(arr) { // 建立大頂堆
        len = arr.length;
        for (var i = Math.floor(len / 2) - 1; i >= 0; i--) { //以他的父節(jié)點來進行判斷
            //i ==取出來的父節(jié)點 
            heapify(arr, i);
            console.log(i);
        }
    }

    function heapify(arr, i) { // 堆調(diào)整
        var left = 2 * i + 1, //左邊子節(jié)點
            right = 2 * i + 2, //右邊子節(jié)點
            largest = i; //把i當(dāng)成大頂堆中的父節(jié)點
        if (left < len && arr[left] > arr[largest]) { //不存在的節(jié)點排除
            largest = left; //如果左邊的子節(jié)點大于他的父節(jié)點 將其位置交換
        }
        if (right < len && arr[right] > arr[largest]) {
            largest = right; //如果右邊的子節(jié)點大于他的父節(jié)點 將其位置交換
        }
        if (largest != i) { //如果largest不等于i,說明他不大于他兩個子節(jié)點中得其中一個
            swap(arr, i, largest); //將位置交換
            heapify(arr, largest); //重新調(diào)用該方法   已達到維護完全二叉樹的性質(zhì)
        }
    }
    //交換位置方法
    function swap(arr, i, j) {
        var temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    function heapSort(arr) {
        buildMaxHeap(arr); //建立新的大頂堆
        //因為 排序后 最頂部已經(jīng)是最大的數(shù) 
        //這里需要將第一位和最后一位的位置更換  將最后一位取出來
        //這時候 就需要保證大頂堆的成立 則需要調(diào)用 堆調(diào)整的方法
        // arr.length - 1 最后一位  0 為第一位(即最大值或者最小值)
        for (var i = arr.length - 1; i > 0; i--) {
            swap(arr, 0, i);
            len--; //每一次父級-1
            heapify(arr, 0); //保證大頂堆的成立
        }
        return arr;
    }
    console.log(heapSort(arr));

7.計數(shù)排序

var arr = [45, 56, 23, 54, 12, 5, 71, 25, 3];

    function countingSort(arr, maxValue) {

        // 根據(jù)數(shù)列的最大值確定統(tǒng)計數(shù)組長度
        var bucket = new Array(maxValue + 1),

            // 創(chuàng)建結(jié)果數(shù)組的起始索引
            sortedIndex = 0,
            arrLen = arr.length,

            // 最大值加1 
            bucketLen = maxValue + 1;
        console.log(bucketLen);

        for (var i = 0; i < arrLen; i++) {

            if (!bucket[arr[i]]) {
                bucket[arr[i]] = 0;
            }
            bucket[arr[i]]++;
        }

        for (var j = 0; j < bucketLen; j++) {
            while (bucket[j] > 0) {
                arr[sortedIndex++] = j;
                bucket[j]--;
            }
        }
        return arr;
    }
    console.log(countingSort(arr, 71));

8.桶排序

 function bucketSort(arr, bucketSize) {
        if (arr.length === 0) {
            return arr;
        }

        var i;
        var minValue = arr[0];
        var maxValue = arr[0];
        for (i = 1; i < arr.length; i++) {
            if (arr[i] < minValue) {
                // 輸入數(shù)據(jù)的最小值
                minValue = arr[i];
            } else if (arr[i] > maxValue) {
                // 輸入數(shù)據(jù)的最大值
                maxValue = arr[i];
            }
        }

        // 桶的初始化
        // 設(shè)置桶的默認數(shù)量為5
        var DEFAULT_BUCKET_SIZE = 5;
        bucketSize = bucketSize || DEFAULT_BUCKET_SIZE;
        var bucketCount = Math.floor((maxValue - minValue) / bucketSize) + 1;
        var bucket = new Array(bucketCount);
        for (i = 0; i < bucket.length; i++) {
            bucket[i] = [];
        }

        // 利用映射函數(shù)將數(shù)據(jù)分配到各個桶中
        for (i = 0; i < arr.length; i++) {
            bucket[Math.floor((arr[i] - minValue) / bucketSize)].push(arr[i]);
        }

        arr.length = 0;
        for (i = 0; i < bucket.length; i++) {
            sort(bucket[i]);

            // 對每個桶進行排序箩朴,這里使用了插入排序
            for (var j = 0; j < bucket[i].length; j++) {
                arr.push(bucket[i][j]);
            }
        }
        return arr;
    }
    console.log(bucketSort(arr, 5));

9.基數(shù)排序

 var counter = [];
    // maxDigit最大位數(shù)
    function sort(arr, maxDigit) {
        var mod = 10;
        var dev = 1;
        for (var i = 0; i < maxDigit; i++, mod *= 10, dev *= 10) {
            // 遍歷數(shù)組彪见,將所有數(shù)放入對應(yīng)桶中
            for (var j = 0; j < arr.length; j++) {
                // 得到此數(shù)所在的桶
                var bucket = parseInt((arr[j] % mod) / dev);
                // 當(dāng)此桶為空時
                if (counter[bucket] == null) {
                    // 聲明此桶為二維數(shù)組 
                    counter[bucket] = [];
                }
                // 將對應(yīng)的數(shù)放入對應(yīng)桶中
                counter[bucket].push(arr[j]);
            }
            var pos = 0;
            // 遍歷桶泰鸡,將桶中的數(shù)依次放入數(shù)組中
            for (var j = 0; j < counter.length; j++) {
                var value = null;
                // 桶不為空時
                if (counter[j] != null) {
                    // 數(shù)組不為空,刪除數(shù)組首位元素
                    while ((value = counter[j].shift()) != null) {
                        // 放入新數(shù)組
                        arr[pos++] = value;
                    }
                }
            }

        }
        return arr;
    }
    console.log(sort(arr));

10.希爾排序

 function shellSort(arr) {
        var len = arr.length;
        for (var gap = Math.floor(len / 2); gap > 0; gap = Math.floor(gap / 2)) {

            for (var i = gap; i < len; i++) {
                var j = 1;
                var current = arr[i];
                while (j - gap >= 0 && current < arr[j - gap]) {
                    arr[j] = arr[j - gap];
                    j = j - gap;
                }
                arr[j] = current;
            }
        }
        return arr;
    }
    console.log(shellSort(arr));
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市缅糟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌祷愉,老刑警劉巖窗宦,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異二鳄,居然都是意外死亡赴涵,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門订讼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來髓窜,“玉大人,你說我怎么就攤上這事〖淖荩” “怎么了鳖敷?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長程拭。 經(jīng)常有香客問我定踱,道長,這世上最難降的妖魔是什么恃鞋? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任崖媚,我火速辦了婚禮,結(jié)果婚禮上恤浪,老公的妹妹穿的比我還像新娘畅哑。我一直安慰自己,他們只是感情好水由,可當(dāng)我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布荠呐。 她就那樣靜靜地躺著,像睡著了一般绷杜。 火紅的嫁衣襯著肌膚如雪直秆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天鞭盟,我揣著相機與錄音圾结,去河邊找鬼。 笑死齿诉,一個胖子當(dāng)著我的面吹牛筝野,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播粤剧,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼歇竟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了抵恋?” 一聲冷哼從身側(cè)響起焕议,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎弧关,沒想到半個月后盅安,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡世囊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年别瞭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片株憾。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡蝙寨,死狀恐怖晒衩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情墙歪,我是刑警寧澤听系,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站箱亿,受9級特大地震影響跛锌,放射性物質(zhì)發(fā)生泄漏弃秆。R本人自食惡果不足惜届惋,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望菠赚。 院中可真熱鬧脑豹,春花似錦、人聲如沸衡查。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拌牲。三九已至俱饿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間塌忽,已是汗流浹背拍埠。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留土居,地道東北人枣购。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像擦耀,于是被迫代替她去往敵國和親棉圈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 冒泡排序 通過相鄰元素的比較和交換眷蜓,使得每一趟循環(huán)都能找到未有序數(shù)組的最大值或最小值分瘾。 最好:O(n),只需要冒泡...
    ___n閱讀 6,077評論 0 8
  • 排序算法說明:(1)對于評述算法優(yōu)劣術(shù)語的說明穩(wěn)定:如果a原本在b前面吁系,而a=b德召,排序后a仍然在b的前面;不穩(wěn)定:...
    阿羨吖閱讀 1,088評論 0 2
  • 排序算法總結(jié) 一垮抗、冒泡排序 冒泡排序每次找出一個最大的元素氏捞,因此需要遍歷 n-1 次。還有一種優(yōu)化算法冒版,就是立一個...
    六千宛閱讀 770評論 0 3
  • 本文首發(fā)于我的個人博客:尾尾部落 排序算法是最經(jīng)典的算法知識液茎。因為其實現(xiàn)代碼短,應(yīng)該廣,在面試中經(jīng)常會問到排序算法...
    繁著閱讀 4,570評論 3 119
  • 某次二面時捆等,面試官問起Js排序問題滞造,吾絞盡腦汁回答了幾種,深感算法有很大的問題栋烤,所以總計一下谒养! 排序算法說明 (1...
    流浪的先知閱讀 1,189評論 0 4