野生前端的資料結構練習(9)氣泡排序,選擇排序,插入排序
阿新 • • 發佈:2018-11-26
[TOC]
一.氣泡排序
bubble sort
的是最基本的演算法,被譽為永遠會被考從來不被用的演算法,基本原則是大數右移,每輪遍歷後最右側的數是最大的,所以下一輪迴圈時可不予考慮,時間複雜度為O(n^2)。
function bubbleSort(arr) { let length = arr.length; for(let i = length - 1; i > 1; i--){ for(let j = 0; j < i ;j++){ if (arr[j] > arr[j+1]) { swap(arr, j, j+1); } } } } function swap(arr, a, b) { let temp; temp = arr[a]; arr[a] = arr[b]; arr[b] = temp; }
二.選擇排序
selection sort
的基本原則是把數放在對的位置上,外層遍歷依次指向每個位置,內層遍歷從剩餘的元素中尋找最小值放在該位置,時間複雜度O(n^2)。
/** * 選擇排序示例程式碼 */ function selectionSort(arr) { let length = arr.length; for(let pos = 0 ; pos < length ; pos++){ let tempMin = pos;//用於記錄當前內層迴圈找到的最小值的下標 for(let j = pos+1 ; j < length ;j++){ if (arr[j] < arr[tempMin]) { tempMin = j; } } swap(arr, pos, tempMin); } } function swap(arr, a, b) { let temp; temp = arr[a]; arr[a] = arr[b]; arr[b] = temp; }
三.插入排序
insertion sort
的基本原則是小數左移,即每輪迴圈結束後,外層迴圈指向位置左側的片段都是已經完成排序的,時間複雜度也為O(n^2)。
/** * 插入排序示例程式碼 */ function insertionSort(arr) { let length = arr.length; for(let pos = 1 ; pos < length ; pos++){ for(let j = pos ; j > 0 ; j--){ if (arr[j] < arr[j-1]) { swap(arr, j, j-1); } } } } function swap(arr, a, b) { let temp; temp = arr[a]; arr[a] = arr[b]; arr[b] = temp; }
四. 一些需要注意的點
1.執行時間
時間複雜度僅僅代表演算法本身隨計算規模的增長時其自身運算量的增長速度,是一種抽象數學符號表達,並不代表程式的執行時間,在程式中對比測試3種演算法時,其執行時間可能出現較大差異,這並不影響其在演算法分析層面的時間複雜度定義。
2.基本優化
基於時間複雜度與程式執行效率並不絕對一致這樣的前提,上面的三種基本演算法在不改變演算法思想的前提下仍然存在優化空間,例如基礎插入排序中,內層迴圈所做的工作可以描述為為當前元素在左側已排序列中找到正確的位置,換句話說,找到正確位置之前,通過swap( )
方法交換相鄰元素的位置的動作是可以不必執行的。
當針對更大的問題規模時,從基本演算法出發,融入其他諸如“分治”,“減治”的思想,就可以得到更高階的演算法,時間複雜度也更低。
3. 如何區分三種基礎排序演算法
對於三種基本排序演算法還不是很清楚的讀者,可以自行搜尋“圖解演算法”相關的博文進行檢視,這三種演算法的時間複雜度是一樣的(都是兩層迴圈),只需要區分其主要排序思想的原則差異,並不難記憶。
- 氣泡排序——大數右移
- 選擇排序——按位入坑
- 選擇排序——小數左移