你需要知道的演算法之排序演算法

noonnnne發表於2017-12-20

0 - 前言

實際生活中我們需要對很多資料進行處理,排序就是其中之一。而面試的時候一些排序演算法、設計模式也是很多面試官的青睞,所以我們更需要理解這些常用的排序演算法的思路(實現原理),排序的程式碼就不在文章內貼出來了(想看的各位請點相應的連結)。

Talk is cheap, show me the code.

1 - 測試陣列資料生成

本文使用100個0~99的不重複的隨機陣列成的陣列:

function notInArrNum(arr){
  var num = Math.floor(Math.random()*100);
  // 生成一個隨機數
  // 如果存在於陣列中 -> 遞迴呼叫
  // 否則將這個隨機數返回
  if(arr.indexOf(num) != -1){
    num = notInArrNum(arr);
  } 
  
  if(arr.indexOf(num) == -1){
    return num;
  }
}
// 生成隨機數陣列
function randomArr() {
  var count = 0;
  var arr = [];
  while(count < 100) {
    var a = notInArrNum(arr);
    arr.push(a);
    count++;
  }
  return arr;
}
複製程式碼

2 - 快速排序

演算法思路

  1. 從陣列中去一個基準值
  2. 將小於基準值的放在一個陣列,大於放入另一個陣列(相同的可以放在任意一側)
  3. 重複地進行第2步操作(遞迴)

效果圖:

QuickSort set up-c280

圖上的灰色矩形代表著正在進行步驟2操作的區域,與深藍色水平線持平的黑塊所在的就是基準值。

快速排序的具體程式碼勞煩各位移步此處

複雜度

一般情況下複雜度為O(nlogn),最糟糕情況為O(n^2)

3 - 氣泡排序

演算法思路

比較相鄰的兩個數,如果前者比後者大,則將它們的位置互換。對所有元素持續遞迴。

效果圖

BubbleSort set up-c280

氣泡排序的具體程式碼勞煩各位移步此處

複雜度

一般情況下的複雜度和最糟糕的複雜度都為O(n^2)

4 - 插入排序

演算法思路

  1. 將第1個元素認為已排序
  2. 取下一個元素,在已排序了的數列裡面從後向前掃描
  3. 如果在已排序數列中正在比較的這個元素大於從未排序數列中取出的元素,則比較已排序中的下一個元素
  4. 重複第3步操作,如果找到已排序的元素小於或等於取出的元素的位置
  5. 將新元素插入到該位置
  6. 重複第2步操作

效果圖

暫無

插入排序的具體程式碼勞煩各位移步此處

複雜度

同氣泡排序

5 - 選擇排序

演算法思路

首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小元素,然後放到排序序列末尾,遞迴執行該操作。

效果圖

QuickSort set up-c280

選擇排序的具體程式碼勞煩各位移步此處

複雜度

一般情況下和最糟糕情況的複雜度都為n^2

6 - 結語

其實這四個排序演算法都是蠻簡單的,不過之前都沒有怎麼去理解它們。另外還有一些在這些演算法的基礎上進行優化的排序演算法例如shell排序、堆排序等等,有興趣的各位也可以看看。

之後的演算法系列可能是Codewars上的,也有可能是經常用上的。另外希望大家多多批評指正,Thanks!

原文地址:點選此處

相關文章