排序算法優劣說明:
穩定:如果a原本在b前面,而a=b,排序之後a仍然在b的前面;
不穩定:如果a原本在b的前面,而a=b,排序之後a可能會出現在b的後面;
內排序:所有排序操作都在內存中完成;
外排序:由於數據太大,因此把數據放在磁盤中,而排序通過磁盤和內存的數據傳輸才能進行;
事件複雜度:一個算法執行所耗費的事件;
空間複雜度:運行完一個程序所需內存的大小;
排序算法圖片總結:
圖片引用自 : js十大排序算法
冒泡排序原理:
依次比較相鄰的兩個值,如果後面的比前面的小,則將小的元素排到前面,依照這個規則進行多次並且遞減的迭代,直到排序順序正確爲止。
舉例說明:
現在有一個數組爲[2,5,3,1,4]
①排序開始,對比第一項和第二項,由於順序是正確的,無需交換;
②對比第二項和第三項,由於5大於3,所以交換位置,3排到前面,結果是[2,3,5,1,4];
③對比第三項和第四項,由於5大於1,所以交換位置,1排到5前面,結果是[2,3,1,5,4];
④再次循環第二項和第三項,3大於1,交換位置,結果是[2,1,3,5,4];
⑤第一項和第二項交換,爲[1,2,3,5,4],第四項和第五項交換爲[1,2,3,4,5]。
冒泡排序:
冒泡排序的第一步其實就是寫一個方法,用於交換數組裏面需要交換位置的兩個元素:
function exchangeNum (items, frontIndex, behindIndex) { var temp = items[frontIndex] items[frontIndex] = items[behindIndex] items[behindIndex] = temp }
正向冒泡排序:
let arr = [89, 99, 10, 3, 15, 1, 45, 78, 32, 9, 18] // 外層循環控制的是循環遍歷的次數,內層循環是遍歷數組 // 因爲需要兩兩比較大小,所以5個元素只需比較4次,arr.length個元素則比較arr.length-1次 for (let i = 0; i < arr.length - 1; i++) { for (let j = 0; j < arr.length - 1 - i; j++) { // 比較相鄰的兩個元素,如果前一個比後一個大,則交換位置 if (arr[j] > arr[j + 1]) { exchangeNum(arr, j, j + 1) } } } console.log(arr) // 輸出:[1, 3, 9, 10, 15, 18, 32, 45, 78, 89, 99]
反向冒泡排序:
let arr = [89, 99, 10, 3, 15, 1, 45, 78, 32, 9, 18] for (let i = arr.length - 1; i >= 0; i--) { for (let j = arr.length - i - 1; j >= 0; j--) { if (arr[j] < arr[j - 1]) { exchangeNum(arr, j, j - 1) } } } console.log(arr) // 輸出:[1, 3, 9, 10, 15, 18, 32, 45, 78, 89, 99]
js的冒泡排序算法可能在實際工作中並沒有什麼應用,實際工作中用的最多的是Array.prototype.sort(),因爲相較於冒泡排序,他擁有更高的效率。但是面試的時候問冒泡排序原理的很多,可能他更像一個工具,可以幫我們更好的瞭解算法。