算法學習筆記:排序算法(一)

算法對大多數前端工程師來說都是一個比較不願意提及的話題,因爲學了,感覺在工作中直接應用的場景不多,不學,大廠面試必考算法,總結來說就是:沒有學習算法的源動力,爲面試學習算法總不會令人動力去學習,沒有動力想要學好算法自然也很難,對我來說,學習算法的動力就是希望寫出更高效率的代碼,更好的理解各種前端框架的設計思路,因此,後面會寫幾篇有關算法的學習筆記,下面進入這篇文章正題:排序算法

冒泡排序

排序算法中最簡單最基礎的就是冒泡排序,這種排序的思想就是相鄰兩個元素進行兩兩比較,大的放後面,每一輪選出最大的元素,讓我們來看具體代碼:

function bubbleSort(arr) {
  for (var i = 0; i < arr.length - 1; i++) {
    for (var j = 0; j < arr.length - i - 1; j++) {
      var temp;
      if (arr[j] > arr[j + 1]) { // 相鄰兩個元素比較,大的往後移動
        temp = arr[j]
        arr[j] = arr[j+1]
        arr[j+1] = temp
      }
    }
  }
  console.log(arr)
}
bubbleSort([3,44,38,5,47,15,36,26,27,2,46,4,19,50,48])

爲了更好的看到排序的過程,讓我們來看下面動態圖片:
圖片描述

冒泡排序,在數組本身就是有序的情況下(最好情況),需要需要n-1次比較能完成,但是在最壞的情況下需要比較和交換n-1+n-2+n-3+...+1=n(n-1)/2次,其算法複雜度爲O(n^2)

選擇排序

選擇排序是最直觀簡單的一種排序算法,具體實現思路就是:把第一個元素假定爲最小元素,遍歷後面沒有排序的元素,如果發現比當最小元素小的值,就記下數組下標,循環執行,當一輪循環結束,將最小下標對應的值和當前元素調換位置,來看具體代碼實現:

function selectionSort(arr) {
  var index,temp // index:最小值下標索引,temp:臨時變量
  for (var i = 0; i < arr.length; i++) {
    index = i
    for (var j = i + 1; j < arr.length; j++) {
      if (arr[j] < arr[index]) {
        index = j
      }
    }
    temp = arr[i]
    arr[i] = arr[index]
    arr[index] = temp
  }
  console.log(arr)
}
selectionSort([3,44,38,5,47,15,36,26,27,2,46,4,19,50,48])

爲了更直觀的展示排序的過程,讓我們來看動態圖片展示:
圖片描述

對於選擇排序來說,比較次數是固定的,而交換次數則和數組的是否有序有關,但數組是正序時,不需要交換,當數組是倒序時,需要交換n-1次,它的時間複雜度是O(n^2)

插入排序

插入排序的實現思路和選擇排序的實現思路有點類似,先將第一個元素設爲已排序,然後遍歷剩餘的元素,如果已排序的元素大於當前的提取元素,已排序的元素向右移動一位,否則就將當前提取的元素插入,來看具體的代碼實現:

function insetSort(arr) {
  for (var i = 0; i < arr.length; i++) {
    var temp = arr[i] // 提取出來的元素
    var j = i - 1
    while (arr[j] > temp) { // 比較已排序元素和當前提取出來的元素
      arr[j+1] = arr[j]
      j--
    }
    arr[j+1] = temp
  }
  console.log(arr)
}
insetSort([3,44,38,5,47,15,36,26,27,2,46,4,19,50,48])

圖片描述

插入排序在最好的情況下,也就是數組正序排列的時候,只要執行n-1次比較和0次交換時間複雜度爲O(n),當爲倒序時,需要n^2/2次比較和n^2/2次交換,其時間複雜依然爲O(n^2)

總結

這篇文章主要介紹了幾個最簡單的排序算法,後面的文章會繼續介紹排序算法相關的內容。
如果有錯誤或不嚴謹的地方,歡迎批評指正,如果喜歡,歡迎點贊收藏

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章