這裏主要介紹的基本排序算法主要包括: 冒泡排序,選擇排序,插入排序,以後的文章會介紹希爾排序,快速排序等高級排序算法, 文章後面會對這幾個算法進行性能比較.
基本排序算法的核心思想是對一組數據按照必定的順序從新排列. 從新排列主要就是嵌套的for循環. 外循環會遍歷數組每一項,內循環進行元素的比較.
注: 文中都以實現升序排序爲例:html
冒泡排序是最慢的排序算法之一, 也是最容易實現的排序算法.使用這種算法進行排序時,數據值會像氣泡同樣從數組的一端漂浮到另外一端,因此稱之爲冒泡排序.假設要對數組按照升序排列,較大的值會浮動到數組的右側,較小值會浮到左側.算法
從開始第一對相鄰元素開始,對每一對相鄰元素進行比較,若是第一個比第二個大,就交換它們兩個, 這樣直到最後一對元素比較結束,最後的元素就是最大的數,重複這個過程,就能夠完成排序.數組
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; }
首先找出當前元素中最小的元素,並放到排序序列的起始位置,而後再從剩餘的元素中尋找最小的元素,而後放到已排序序列的末尾。以此類推,直到排序完成。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; }
從第二個元素開始(假定第一個元素已經排序了),取出這個元素,在已經排序的元素中從後向前進行比較,若是該元素大於這個元素,就將該元素移動到下一個位置,而後繼續向前進行比較,直到找到小於或者等於該元素的位置,將該元素插入到這個位置後.重複這個步驟直到排序完成.性能
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; }
使用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