詳解js中常用4個基礎算法
冒泡排序
原理
相鄰兩個數據的按條件交換排序,然后遍歷式的交換排序。何為冒泡?每次遍歷為一次 冒泡,一次遍歷完成,冒泡結束至少會讓一個元素移動到正確的位置。
列:
const arr = [3, 2, 1]; // 第1次冒泡后[2, 1,3] 3移動到正確位置 // 第2次冒泡后[1,2,3] 2移動到正確位置
它排序需要兩次循環(huán)來設計:
第一層循環(huán)控制排序arr.length - 1次
第二層循環(huán)負責每次交換遍歷數據的相鄰數據交換, 共arr.length - 1 - i次,i第一層循環(huán) 已循環(huán)次數。
代碼
export const mySort = arr => {
for (let i = 0; i < arr.length - 1; i++) {
// 控制循環(huán)次數
for (let j = 0; j < arr.length - i - 1; j++) {
// 數據交換
if (arr[j] > arr[j + 1]) {
const temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
};實現array.sort:
export const mySort = (arr, fn) => {
for (let i = 0; i < arr.length - 1; i++) {
// 控制循環(huán)次數
for (let j = 0; j < arr.length - i - 1; j++) {
// 數據交換
if (fn(arr[j], arr[j + 1])) {
const temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
};
mySort([1, 5, 3, 8, 2, 4], (a, b) => a > b); // ?[1, 2, 3, 4, 5, 8]
mySort([1, 5, 3, 8, 2, 4], (a, b) => a < b); // [8, 5, 4, 3, 2, 1]選擇排序
原理
對數組遍歷后選取符合條件(最大或最小)的數,與數組對應位置的數進行交換。何為選擇?每次遍歷為一次 選擇,一次遍歷完成結束會得出一個符合條件的元素并交換位置。
列:
const arr = [3, 2, 1]; // 第1次選擇后[1, 2,3] 1與3交換位置 // 第2次選擇后[1, 2,3]
它與冒泡排序不同的是它不會頻繁的發(fā)生交換,第一層循環(huán)結束后,看條件是否滿足需要交換。
它排序需要兩次循環(huán)來設計:
第一層循環(huán)控制排序arr.length - 1次
第二層循環(huán)負責找出交換下標index, j = ij前面已排好。
代碼
export const mySort = (arr, fn) => {
for (let i = 0; i < arr.length - 1; i++) {
// 控制循環(huán)次數
let index = i;
for (let j = i; j < arr.length; j++) {
// 找出下標
if (fn(arr[j], arr[index])) {
index = j;
}
}
// 交換數據
if (index !== i) {
const copy = arr[index];
arr[index] = arr[i];
arr[i] = copy;
}
}
return arr;
};
mySort([9, 5, 3, 4], (a, b) => a > b); // [9, 5, 4, 3]插入排序
原理
以下內容來自參考文章:@插入排序通過構建有序序列,對于未排序數據,在已排序序列中從后向前掃描,找到相應位置并插入。
一般來說,插入排序都采用 in-place 在數組上實現:
- 從第一個元素開始,該元素可以認為已經被排序;
- 取出下一個元素,在已經排序的元素序列中從后向前掃描;
- 如果該元素(已排序)大于新元素,將該元素移到下一位置;
- 重復步驟3,直到找到已排序的元素小于或者等于新元素的位置;
- 將新元素插入到該位置后;
- 重復步驟2~5。
動圖展示

代碼
const insertion = arr => {
const len = arr.length;
let preIndex;
let current;
for (let i = 1; i < len; i++) {
preIndex = i - 1;
current = arr[i];
while (preIndex >= 0 && current < arr[preIndex]) {
arr[preIndex + 1] = arr[preIndex];
preIndex--;
}
arr[preIndex + 1] = current;
}
return arr;
};
insertion([3, 5, 7, 1, 4, 56, 12, 78, 25, 0, 9, 8, 42, 37]);
// ?[0, 1, 3, 4, 5, 7, 8, 9, 12, 25, 37, 42, 56, 78]快速排序
原理
快速排序使用分治法策略來把一個數組分為兩個數組,再重復把這兩個數組變成四個,直至length <= 1。 思路:
- 從數組中挑出一個元素,稱為 "基準"。
- 重新排序數組,所有元素比基準值小的擺放在基準前面(left),所有元素比基準值大的擺在基準的后面(right),相同的數可以到任一邊。在這個分區(qū)退出之后,該基準就處于數列的中間位置。這個稱為分區(qū)操作。
- 遞歸 地把小于基準值元素的數組和大于基準值元素的數組排序,重復1~2。
代碼
const quickSort = arr => {
const len = arr.length;
if (len <= 1) return arr;
// 基準
const num = arr[0];
// 左右分區(qū)
const left = [];
const right = [];
for (let index = 1; index < arr.length; index++) {
arr[index] <= num ? left.push(arr[index]) : right.push(arr[index]);
}
// 遞歸
return quickSort(left).concat([num], quickSort(right));
};
console.log(quickSort([3, 2, 6, 8, 99, 2, 3]));//?[2, 2, 3, 3, 6, 8, 99]以上就是詳解js中常用4個基礎算法的詳細內容,更多關于js基礎算法的資料請關注腳本之家其它相關文章!

