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

基本排序算法

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

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.選擇排序

原理:

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

示意圖:

代碼:

      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種算法所用時間:spa

  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!code

固然, 要進行屢次運行, 獲得的結果才能被視爲有效的結論. 很顯然, 插入排序比其餘兩種排序方法快.htm

 

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

相關文章
相關標籤/搜索