基本排序算法
這里主要介紹的基本排序算法主要包括: 冒泡排序,選擇排序,插入排序,之后的文章會介紹希爾排序,快速排序等高級排序算法, 文章后面會對這幾個算法進行性能比較.
基本排序算法的核心思想是對一組數據按照一定的順序重新排列. 重新排列主要就是嵌套的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