詳解js中常用4個基礎算法
冒泡排序
原理
相鄰兩個數(shù)據(jù)的按條件交換排序,然后遍歷式的交換排序。何為冒泡?
每次遍歷為一次 冒泡
,一次遍歷完成,冒泡結(jié)束至少會讓一個元素移動到正確的位置。
列:
const arr = [3, 2, 1]; // 第1次冒泡后[2, 1,3] 3移動到正確位置 // 第2次冒泡后[1,2,3] 2移動到正確位置
它排序需要兩次循環(huán)來設計:
第一層循環(huán)控制排序arr.length - 1
次
第二層循環(huán)負責每次交換遍歷數(shù)據(jù)的相鄰數(shù)據(jù)交換, 共arr.length - 1 - i
次,i
第一層循環(huán) 已循環(huán)次數(shù)。
代碼
export const mySort = arr => { for (let i = 0; i < arr.length - 1; i++) { // 控制循環(huán)次數(shù) for (let j = 0; j < arr.length - i - 1; j++) { // 數(shù)據(jù)交換 if (arr[j] > arr[j + 1]) { const temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } return arr; };
實現(xiàn)array.sort
:
export const mySort = (arr, fn) => { for (let i = 0; i < arr.length - 1; i++) { // 控制循環(huán)次數(shù) for (let j = 0; j < arr.length - i - 1; j++) { // 數(shù)據(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]
選擇排序
原理
對數(shù)組遍歷后選取符合條件(最大或最?。┑臄?shù),與數(shù)組對應位置的數(shù)進行交換。何為選擇?
每次遍歷為一次 選擇
,一次遍歷完成結(jié)束會得出一個符合條件的元素并交換位置。
列:
const arr = [3, 2, 1]; // 第1次選擇后[1, 2,3] 1與3交換位置 // 第2次選擇后[1, 2,3]
它與冒泡排序不同的是它不會頻繁的發(fā)生交換,第一層循環(huán)結(jié)束后,看條件是否滿足需要交換。
它排序需要兩次循環(huán)來設計:
第一層循環(huán)控制排序arr.length - 1
次
第二層循環(huán)負責找出交換下標index
, j = i
j前面已排好。
代碼
export const mySort = (arr, fn) => { for (let i = 0; i < arr.length - 1; i++) { // 控制循環(huán)次數(shù) let index = i; for (let j = i; j < arr.length; j++) { // 找出下標 if (fn(arr[j], arr[index])) { index = j; } } // 交換數(shù)據(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]
插入排序
原理
以下內(nèi)容來自參考文章:@插入排序通過構(gòu)建有序序列,對于未排序數(shù)據(jù),在已排序序列中從后向前掃描,找到相應位置并插入。
一般來說,插入排序都采用 in-place 在數(shù)組上實現(xiàn):
- 從第一個元素開始,該元素可以認為已經(jīng)被排序;
- 取出下一個元素,在已經(jīng)排序的元素序列中從后向前掃描;
- 如果該元素(已排序)大于新元素,將該元素移到下一位置;
- 重復步驟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]
快速排序
原理
快速排序使用分治法策略來把一個數(shù)組分為兩個數(shù)組,再重復把這兩個數(shù)組變成四個,直至length <= 1
。 思路:
- 從數(shù)組中挑出一個元素,稱為 "基準"。
- 重新排序數(shù)組,所有元素比基準值小的擺放在基準前面(left),所有元素比基準值大的擺在基準的后面(right),相同的數(shù)可以到任一邊。在這個分區(qū)退出之后,該基準就處于數(shù)列的中間位置。這個稱為分區(qū)操作。
- 遞歸 地把小于基準值元素的數(shù)組和大于基準值元素的數(shù)組排序,重復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個基礎算法的詳細內(nèi)容,更多關(guān)于js基礎算法的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
javascript 得到文件后綴名的思路及實現(xiàn)
在上傳文件時,常常要對文件的類型即對文件的后綴名進行判斷,用javascript可以很容易的做到這一點。用Javascript解析一個帶絕對路徑的文件名并得到后綴名的方法有很多種,這里列出一種,以供參考。2013-07-07JavaScript實現(xiàn)時間格式的切割與轉(zhuǎn)換
這篇文章主要為大家詳細介紹了使用JavaScript實現(xiàn)時間格式的切割與轉(zhuǎn)換的相關(guān)知識,文中的示例代碼講解詳細,有需要的小伙伴可以參考一下2024-04-04javascript 手動給表增加數(shù)據(jù)的小例子
這篇文章介紹了js手動給表增加數(shù)據(jù)的實例代碼,有需要的朋友可以參考一下2013-07-07