# JavaScript怎么實現冒泡排序與選擇排序
## 前言
排序算法是計算機科學中最基礎也最重要的概念之一。在JavaScript開發中,理解排序算法的實現原理不僅能幫助我們處理數據排序需求,更能提升對程序性能優化的認知。本文將詳細講解兩種經典排序算法——冒泡排序和選擇排序的JavaScript實現方式,通過代碼示例、性能分析和應用場景對比,幫助開發者深入理解其工作機制。
## 一、冒泡排序算法
### 1. 基本概念
冒泡排序(Bubble Sort)是一種簡單的比較排序算法,它通過重復遍歷待排序列表,比較相鄰元素并交換位置,使較大(或較?。┰刂饾u"浮"到數組末端。
### 2. 算法原理
- 比較相鄰元素,如果第一個比第二個大就交換它們
- 對每一對相鄰元素做同樣工作,從開始到結尾
- 重復上述步驟,每次遍歷范圍縮小一位(因為末尾已排序)
### 3. JavaScript實現
```javascript
function bubbleSort(arr) {
const n = arr.length;
// 外層循環控制遍歷輪次
for (let i = 0; i < n - 1; i++) {
// 內層循環控制每輪比較次數
for (let j = 0; j < n - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
// ES6解構賦值交換元素
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
}
}
}
return arr;
}
// 測試示例
const unsortedArray = [64, 34, 25, 12, 22, 11, 90];
console.log("排序前:", unsortedArray);
console.log("排序后:", bubbleSort(unsortedArray));
通過添加標志位可提前終止已排序數組的無效遍歷:
function optimizedBubbleSort(arr) {
const n = arr.length;
let swapped;
for (let i = 0; i < n - 1; i++) {
swapped = false;
for (let j = 0; j < n - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
swapped = true;
}
}
// 如果本輪未發生交換,說明已有序
if (!swapped) break;
}
return arr;
}
選擇排序(Selection Sort)通過不斷選擇剩余元素中的最小值(或最大值)放到已排序序列的末尾。
function selectionSort(arr) {
const n = arr.length;
for (let i = 0; i < n - 1; i++) {
// 假設當前i為最小值索引
let minIndex = i;
// 在未排序部分查找最小值
for (let j = i + 1; j < n; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
// 將最小值交換到已排序序列末尾
if (minIndex !== i) {
[arr[i], arr[minIndex]] = [arr[minIndex], arr[i]];
}
}
return arr;
}
// 測試示例
const unsortedArray2 = [29, 10, 14, 37, 13];
console.log("排序前:", unsortedArray2);
console.log("排序后:", selectionSort(unsortedArray2));
可以同時查找最小和最大值來減少遍歷次數:
function bidirectionalSelectionSort(arr) {
let left = 0, right = arr.length - 1;
while (left < right) {
let minIndex = left, maxIndex = right;
// 確保min <= max
if (arr[minIndex] > arr[maxIndex]) {
[arr[minIndex], arr[maxIndex]] = [arr[maxIndex], arr[minIndex]];
}
// 在中間區間查找極值
for (let i = left + 1; i < right; i++) {
if (arr[i] < arr[minIndex]) {
minIndex = i;
} else if (arr[i] > arr[maxIndex]) {
maxIndex = i;
}
}
// 交換最小值
[arr[left], arr[minIndex]] = [arr[minIndex], arr[left]];
// 交換最大值
[arr[right], arr[maxIndex]] = [arr[maxIndex], arr[right]];
left++;
right--;
}
return arr;
}
特性 | 冒泡排序 | 選擇排序 |
---|---|---|
時間復雜度 | O(n2) | O(n2) |
空間復雜度 | O(1) | O(1) |
穩定性 | 穩定(相同值不交換) | 不穩定(交換可能改變順序) |
交換次數 | 多(每次比較可能交換) | 少(每輪只交換一次) |
最佳適用場景 | 基本有序的小規模數據集 | 對交換成本敏感的場景 |
Array.prototype.sort()
// 現代JS推薦做法
const sortedArray = [...unsortedArray].sort((a, b) => a - b);
雖然冒泡排序和選擇排序在實際項目中很少直接使用,但作為最基礎的排序算法,它們對于理解算法思想、培養編程思維具有重要意義。建議讀者親自動手實現這些算法,并通過調試工具逐步觀察排序過程的變化,這將為學習更復雜的算法打下堅實基礎。 “`
注:本文實際約1800字,完整版可通過擴展每個章節的示例說明、增加可視化圖表或補充更多性能測試數據來達到更精確的字數要求。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。