JS實現排序演算法(氣泡排序、快速排序)
阿新 • • 發佈:2018-12-20
const a = [21, 3, 242, 3432, 13, 13, 123, 4, 35, 22, 1]; // 氣泡排序 // 核心思想:每次比較相鄰的數,如果它們順序錯誤,就把它們交換過來。如同氣泡一樣往後翻滾。 // 最外層的迴圈,每次至少要讓一個元素歸位。 // 氣泡排序的時間複雜度太高,達到了O(n*n) const res2 = [...a]; for (let i = 0; i < res2.length - 1; i++) { for (let j = 0; j < res2.length - i - 1; j++) { if (res2[j] > res2[j + 1]) { let t = res2[j]; res2[j] = res2[j + 1]; res2[j + 1] = t; } } } console.log(res2); // 快速排序 // 基於“二分”的思想,每次確認一個基準數,將基準數歸位,然後以基準數為中心點,拆分為兩塊分別進行遞迴繼續將基準數歸位... //快速排序的每一輪處理其實就是將這一輪的基準數歸位, 直到所有的數都歸位為止, 排序就結束了。 // 平均時間複雜度為O(NlogN) const res3 = [...a]; function quickSort(arr, left, right) { let num = arr[left]; //確認基準數 let l = left; // 當前基準數的下標 let r = right; // 儲存上一個基準數的歸位位置。 if (left > right) { return; } while (left !== right) { while (arr[right] >= num && left < right) { right--; } while (arr[left] <= num && left < right) { left++; } if (left < right) { let t = arr[right]; arr[right] = arr[left]; arr[left] = t; } } // left與right相等時,意味著找到了基準數應該在的位置,此時將基準數歸位。 arr[l] = arr[left]; arr[left] = num; quickSort(arr, l, left - 1); // left表示當前基準數的歸位位置。 quickSort(arr, left + 1, r); // r表示上一個基準數的歸位位置。 } quickSort(res3, 0, res3.length - 1); console.log(res3);