前端算法-基本排序算法比較


基本排序算法

  這里主要介紹的基本排序算法主要包括: 冒泡排序,選擇排序,插入排序,之后的文章會介紹希爾排序,快速排序等高級排序算法, 文章后面會對這幾個算法進行性能比較.
基本排序算法的核心思想是對一組數據按照一定的順序重新排列. 重新排列主要就是嵌套的for循環. 外循環會遍歷數組每一項,內循環進行元素的比較.
注: 文中都以實現升序排序為例:

1.冒泡排序

  冒泡排序是最慢的排序算法之一, 也是最容易實現的排序算法.使用這種算法進行排序時,數據值會像氣泡一樣從數組的一端漂浮到另一端,所以稱之為冒泡排序.假設要對數組按照升序排列,較大的值會浮動到數組的右側,較小值會浮到左側.

原理:

  從開始第一對相鄰元素開始,對每一對相鄰元素進行比較,如果第一個比第二個大,就交換它們兩個, 這樣直到最后一對元素比較結束,最后的元素就是最大的數,重復這個過程,就可以完成排序.

示意圖:

代碼:

      function bubbleSort(arr) {
        for (let i = 0; i < arr.length; i++) {
          for (let j = 0; j < arr.length - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
              let temp = arr[j];
              arr[j] = arr[j + 1];
              arr[j + 1] = temp;
            }
          }
        }
        return arr;
      }

2.選擇排序

原理:

  首先找出當前元素中最小的元素,並放到排序序列的起始位置,然后再從剩余的元素中尋找最小的元素,然后放到已排序序列的末尾。以此類推,直到排序完成。

示意圖:

代碼:

      function selectionSort(arr) {
        var len = arr.length;
        var minIndex, temp;
        for (var i = 0; i < len - 1; i++) {
          minIndex = i;
          for (var j = i + 1; j < len; j++) {
            if (arr[j] < arr[minIndex]) {
              minIndex = j;
            }
          }
          temp = arr[i];
          arr[i] = arr[minIndex];
          arr[minIndex] = temp;
        }
        return arr;
      }

 

3.插入排序

原理:

  從第二個元素開始(假定第一個元素已經排序了),取出這個元素,在已經排序的元素中從后向前進行比較,如果該元素大於這個元素,就將該元素移動到下一個位置,然后繼續向前進行比較,直到找到小於或者等於該元素的位置,將該元素插入到這個位置后.重復這個步驟直到排序完成.

示意圖:

代碼: 

      function insertionSort(arr) {
        var len = arr.length;
        var preIndex, current;
        for (var i = 1; i < len; i++) {
          preIndex = i - 1;
          current = arr[i];
          while (preIndex >= 0 && arr[preIndex] > current) {
            arr[preIndex + 1] = arr[preIndex];
            preIndex--;
          }
          arr[preIndex + 1] = current;
        }
        return arr;
      }

4.基本排序算法的性能比較

  使用console.time進行時間計算,在需要測試的開始位置寫上console.time,並且括號內傳一個字符串。在結束的位置使用console.timeEnd方法,並再次把字符串傳入,即可在控制台查看執行時間.
首先創建一個n位隨機數組用來測試.

      function createRandomArr(n) {
        let arr = [];
        for (let i = 0; i < n; i++) {
          arr.push(Math.floor((Math.random() * 100)));
        }
        return arr;
      }

分別記錄3種算法所用時間:

  var testArr = createRandomArr(1000);
  //  記錄冒泡排序所用時間
  console.time('bubbleSort');
  bubbleSort(testArr);
  console.timeEnd('bubbleSort');
  var testArr = createRandomArr(1000);
  //  記錄選擇排序所用時間
  console.time('selectionSort');
  selectionSort(testArr);
  console.timeEnd('selectionSort');
  var testArr = createRandomArr(1000);
  //  記錄插入排序所用時間
  console.time('insertionSort');
  insertionSort(testArr);
  console.timeEnd('insertionSort');

在Chrome執行代碼,在控制台看看他們的執行時間對比, Duang Duang Duang!

當然, 要進行多次運行, 得到的結果才能被視為有效的結論. 很顯然, 插入排序比其他兩種排序方法快.

 

注: 文中圖片轉自: https://www.cnblogs.com/onepixel/articles/7674659.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM