常見的排序算法有哪些岳锁?如何實現(xiàn)這些算法绩衷?

1.背景介紹


在計算機科學與數(shù)學中,一個排序算法是一種能將一串資料依照特定排序方式進行排列的一種算法激率。 最常用到的排序方式是數(shù)值順序以及字典順序咳燕。 排序算法用在處理文字資料以及產(chǎn)生人類可讀的輸出結(jié)果。 基本上乒躺,排序算法的輸出必須遵守下列兩個原則:

  • 輸出結(jié)果為遞增序列(遞增是針對所需的排序順序而言)
  • 輸出結(jié)果是原輸入的一種排列招盲、或是重組
  • 雖然排序算法是一個簡單的問題,但是從計算機科學發(fā)展以來聪蘸,在此問題上已經(jīng)有大量的研究宪肖。 更多的新算法仍在不斷的被發(fā)明表制。

    2.知識剖析

    查找和排序算法是算法的入門知識,其經(jīng)典思想可以用于很多算法當中控乾。因為其實現(xiàn)代碼較短么介,應用較常見。 所以在面試中經(jīng)常會問到排序算法及其相關的問題蜕衡。但萬變不離其宗壤短,只要熟悉了思想,靈活運用也不是難事慨仿。 一般在面試中最尘酶考的是快速排序和歸并排序,并且經(jīng)常有面試官要求現(xiàn)場寫出這兩種排序的代碼镰吆。 對這兩種排序的代碼一定要信手拈來才行帘撰。還有插入排序、冒泡排序万皿、堆排序摧找、基數(shù)排序、桶排序等牢硅。

    • 冒泡算法
    • 選擇排序
    • 插入排序
    • 快速排序
    • 3.常見問題

      問題:如何用JavaScript 如何實現(xiàn)?

      4.解決方案

      冒泡排序

      冒泡排序是一種簡單的排序算法蹬耘。它重復地走訪過要排序的數(shù)列,一次比較兩個元素减余, 如果他們的順序錯誤就把他們交換過來综苔。走訪數(shù)列的工作是重復地進行直到?jīng)]有元素再需要交換, 也就是說該數(shù)列已經(jīng)排序完成位岔。

      冒泡排序演算法的運作如下:

      1. 比較相鄰的元素如筛。如果第一個比第二個大,就交換他們兩個赃承。
      2. 對每一對相鄰元素作同樣的工作妙黍,從開始第一對到結(jié)尾的最后一對。這步做完后瞧剖,最后的元素會是最大的數(shù)拭嫁。
      3. 針對所有的元素重復以上的步驟,除了最后一個抓于。
      4. 持續(xù)每次對越來越少的元素重復上面的步驟做粤,直到?jīng)]有任何一對數(shù)字需要比較。
      5. 冒泡排序

        var examplearr=[8,94,15,88,55,76,21,39];

        function sortarr(arr){

        for(i=0;i

        for(j=0;j

        if(arr[j]>arr[j+1]){

        var temp=arr[j];

        arr[j]=arr[j+1];

        arr[j+1]=temp;

        }

        }

        }

        return arr;

        }

        sortarr(examplearr);

        console.log(examplearr);

        冒泡排序

        基本思路:1.依次比較相鄰的兩個數(shù)捉撮,如果第一個比第二個小怕品,不變。如果第一個比第二個大巾遭,調(diào)換順序肉康。一輪下來闯估,最后一個是最大的數(shù)

        2.對除了最后一個之外的數(shù)重復第一步,直到只剩一個數(shù)

        選擇排序(Selection sort)是一種簡單直觀的排序算法吼和。它的工作原理如下涨薪。 首先在未排序序列中找到最小(大)元素炫乓,存放到排序序列的起始位置刚夺,然后,再從剩余未排序元素中繼續(xù)尋找最心┑贰(大)元素侠姑, 然后放到已排序序列的末尾。以此類推箩做,直到所有元素均排序完畢莽红。

        選擇排序的思想其實和冒泡排序有點類似,都是在一次排序后把最小的元素放到最前面卒茬。但是過程不同船老, 冒泡排序是通過相鄰的比較和交換咖熟。而選擇排序是通過對整體的選擇圃酵。

        選擇排序

        Array.prototype.selectionSort = function() {

        var i, j, min;

        var temp;

        for (i = 0; i < this.length - 1; i++) {

        min = i;

        for (j = i + 1; j < this.length; j++)

        if (this[min] > this[j])

        min = j;

        temp = this[min];

        this[min] = this[i];

        this[i] = temp;

        }

        return this;

        };

        var num = [22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70]; //定義一個數(shù)組

        num.selectionSort(); //數(shù)組定義選擇排序算法

        選擇排序

        1.找出最小的數(shù),和第一個交換位置

        2.在剩下的數(shù)中馍管,找出最二小的數(shù)郭赐,放在第二個

        3.依次類推,排出順序

        插入排序也是一個簡單直觀的排序算法确沸。它的 工作原理是通過構建有序序列捌锭,對于未排序數(shù)據(jù), 在已排序序列中從后向前掃描罗捎,找到相應位置并插入观谦。插入排序在實現(xiàn)上,通常采用in-place排序 (即只需用到O(1)的額外空間的排序)桨菜,因而在從后向前掃描過程中豁状,需要反復把已排序元素逐步向后挪位, 為最新元素提供插入空間倒得。

        1. 從第一個元素開始泻红,該元素可以認為已經(jīng)被排序
        2. 取出下一個元素,在已經(jīng)排序的元素序列中從后向前掃描
        3. 如果該元素(已排序)大于新元素霞掺,將該元素移到下一位置
        4. 將新元素插入到該位置后
        5. 重復步驟2~5
        6. 插入排序

          Array.prototype.insertionSort = function () {

          for (var i = 1; i < this.length; i++) {

          var temp = this[i];

          var j = i - 1;

          //如果將賦值放到下一行的for循環(huán)內(nèi), 會導致在第13行出現(xiàn)j未聲明的錯誤

          for (; j >= 0 && this[j] > temp; j--) {

          this[j + 1] = this[j];

          }

          this[j + 1] = temp;

          }

          return this;

          }

          var num = [22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70]; //定義一個數(shù)組

          num.insertionSort(); //數(shù)組調(diào)用插入排序算法

          插入排序

          基本思路:1.把數(shù)組分為[已排序]和[未排序]兩部分,第一個數(shù)為[已排序]谊路,其余為[未排序]

          2.從[未排序]抽出第一個數(shù),和[已排序]部分比較菩彬,插入到合適的位置

          快速排序

          步驟為:

          1. 從數(shù)列中挑出一個元素缠劝,稱為"基準"(pivot)潮梯,
          2. 重新排序數(shù)列,所有比基準值小的元素擺放在基準前面惨恭,所有比基準值大的元素擺在基準后面(相同的數(shù)可以到任一邊)酷麦。在這個分割結(jié)束之后,該基準就處于數(shù)列的中間位置喉恋。這個稱為分割(partition)操作沃饶。
          3. 遞歸地(recursively)把小于基準值元素的子數(shù)列和大于基準值元素的子數(shù)列排序。
          4. 遞歸到最底部時轻黑,數(shù)列的大小是零或一糊肤,也就是已經(jīng)排序好了。這個演算法一定會結(jié)束氓鄙,因為在每次的迭代(iteration)中馆揉,它至少會把一個元素擺到它最后的位置去。

            Array.prototype.quickSort = function() {

            var len = this.length;

            if (len <= 1)

            return this.slice(0);

            var left = [];

            var right = [];

            var mid = [this[0]];

            for (var i = 1; i < len; i++)

            if (this[i] < mid[0])

            left.push(this[i]);

            else

            right.push(this[i]);

            return left.quickSort().concat(mid.concat(right.quickSort()));

            };

            var arr = [5, 3, 7, 4, 1, 9, 8, 6, 2];

            arr = arr.quickSort();

            快速排序

            1.以一個數(shù)為基準(中間的數(shù))抖拦,比基準小的放到左邊升酣,比基準大的放到右邊

            2.再按此方法對這兩部分數(shù)據(jù)分別進行快速排序(遞歸進行

            3.不能再分后退出遞歸,并重新將數(shù)組合并

            5.編碼實戰(zhàn)

            6.擴展思考

            如何評價算法的好壞

            正確性

            算法能滿足具體問題的需求态罪,即對任何合法的輸入算法都會得出正確的結(jié)果噩茄。

            可讀性

            算法創(chuàng)建后由人來閱讀、理解复颈、使用以及修改绩聘。所以可讀性的好壞直接影響到算法的好壞。如果一個算法涉及的想法很多耗啦,就會給閱讀的人造成困難凿菩,那么這個算法就不能得到更好的交流和推廣,更不便于對算法進行修改帜讲、擴展和維護衅谷。所以要提高算法的可讀性,就要做到簡明易懂似将。

            健壯性

            一個程序完成后获黔,運行該程序的用戶對程序的理解各有不同,并不能保證每一個人都能按照要求進行輸入玩郊,健壯性就是指對非法輸入的抵抗能力肢执,當輸入的數(shù)據(jù)非法時,算法能識別并做出處理译红,而不會因為輸入的錯誤產(chǎn)生錯誤動作或造成癱瘓

            時間復雜度與空間復雜度

            時間復雜度簡單地說就是算法運行所需要的時間预茄。不同的算法具有不同的時間復雜度,當一個程序較小時感覺不到時間復雜度的重要性,當一個程序特別大時便會察覺到時間復雜度的重要性耻陕。所以如何寫出更高速的算法一直是算法不斷改進的目標拙徽。空間復雜度是指算法運行所需的存儲空間诗宣,隨著計算機硬件的發(fā)展膘怕,空間復雜度已經(jīng)顯得不再那么重要

            7.參考文獻

            參考二:常見排序算法之JavaScript實現(xiàn)

            參考一:JavaScript 排序算法匯總

            最后編輯于
            ?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
            • 序言:七十年代末,一起剝皮案震驚了整個濱河市召庞,隨后出現(xiàn)的幾起案子岛心,更是在濱河造成了極大的恐慌,老刑警劉巖篮灼,帶你破解...
              沈念sama閱讀 216,372評論 6 498
            • 序言:濱河連續(xù)發(fā)生了三起死亡事件忘古,死亡現(xiàn)場離奇詭異,居然都是意外死亡诅诱,警方通過查閱死者的電腦和手機髓堪,發(fā)現(xiàn)死者居然都...
              沈念sama閱讀 92,368評論 3 392
            • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來娘荡,“玉大人干旁,你說我怎么就攤上這事∨阢澹” “怎么了争群?”我有些...
              開封第一講書人閱讀 162,415評論 0 353
            • 文/不壞的土叔 我叫張陵,是天一觀的道長央拖。 經(jīng)常有香客問我祭阀,道長,這世上最難降的妖魔是什么鲜戒? 我笑而不...
              開封第一講書人閱讀 58,157評論 1 292
            • 正文 為了忘掉前任,我火速辦了婚禮抹凳,結(jié)果婚禮上遏餐,老公的妹妹穿的比我還像新娘。我一直安慰自己赢底,他們只是感情好失都,可當我...
              茶點故事閱讀 67,171評論 6 388
            • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著幸冻,像睡著了一般粹庞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上洽损,一...
              開封第一講書人閱讀 51,125評論 1 297
            • 那天庞溜,我揣著相機與錄音,去河邊找鬼碑定。 笑死流码,一個胖子當著我的面吹牛又官,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播漫试,決...
              沈念sama閱讀 40,028評論 3 417
            • 文/蒼蘭香墨 我猛地睜開眼六敬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了驾荣?” 一聲冷哼從身側(cè)響起外构,我...
              開封第一講書人閱讀 38,887評論 0 274
            • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎播掷,沒想到半個月后典勇,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
              沈念sama閱讀 45,310評論 1 310
            • 正文 獨居荒郊野嶺守林人離奇死亡叮趴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
              茶點故事閱讀 37,533評論 2 332
            • 正文 我和宋清朗相戀三年割笙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片眯亦。...
              茶點故事閱讀 39,690評論 1 348
            • 序言:一個原本活蹦亂跳的男人離奇死亡伤溉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出妻率,到底是詐尸還是另有隱情乱顾,我是刑警寧澤,帶...
              沈念sama閱讀 35,411評論 5 343
            • 正文 年R本政府宣布宫静,位于F島的核電站走净,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏孤里。R本人自食惡果不足惜伏伯,卻給世界環(huán)境...
              茶點故事閱讀 41,004評論 3 325
            • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捌袜。 院中可真熱鬧说搅,春花似錦、人聲如沸虏等。這莊子的主人今日做“春日...
              開封第一講書人閱讀 31,659評論 0 22
            • 文/蒼蘭香墨 我抬頭看了看天上的太陽霍衫。三九已至候引,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間敦跌,已是汗流浹背澄干。 一陣腳步聲響...
              開封第一講書人閱讀 32,812評論 1 268
            • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人傻寂。 一個月前我還...
              沈念sama閱讀 47,693評論 2 368
            • 正文 我出身青樓息尺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親疾掰。 傳聞我的和親對象是個殘疾皇子搂誉,可洞房花燭夜當晚...
              茶點故事閱讀 44,577評論 2 353

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

            • 又是一個周末,時間飛快静檬,轉(zhuǎn)眼一個月又將過去炭懊。 心想已經(jīng)一個多月沒有給家里打電話了,心中思緒萬千拂檩,混亂絞痛夾著一絲絲...
              簡默Trina閱讀 185評論 0 1
            • 8.9-8.25 17個日夜侮腹,我在東莞度過。我不是去東莞度假稻励,不是去玩樂父阻。而是進了一家名為富強的電子廠,沒錯望抽,在高...
              iiiiich閱讀 184評論 0 0
            • 【作者 0han 本篇代碼來源于實驗樓shiyanlou.com】 這一篇沒有太多介紹原理 因為是在學習pytho...
              0han閱讀 2,431評論 0 1
            • 3月末 春天總算是來了 還帶了點兒夏的氣息 風吹地人 有些暖暖的 還有些懶懶的 吹地我 想起了3月的故鄉(xiāng) 還有那長...
              goldfisher閱讀 218評論 0 0
            • 上一次見到小七的時候,是高考前幾個星期辑奈。我們站在圓形回廊上苛茂,她望著我,突然就說了一句:“前段時間他生日鸠窗,我送了個畫...
              待君淺笑閱讀 170評論 6 5