JavaScript實(shí)現(xiàn)基礎(chǔ)排序算法的示例詳解
前言
文本來(lái)總結(jié)常見(jiàn)的排序算法,通過(guò) JvavScript 來(lái)實(shí)現(xiàn)
正文
1、冒泡排序
算法思想:比較相鄰兩個(gè)元素的大小,如果第一個(gè)比第二個(gè)大,就交換它們。從頭遍歷到尾部,當(dāng)一輪遍歷完后,數(shù)組最后一個(gè)元素是最大的。除去最后一個(gè)元素,對(duì)剩下的元素重復(fù)執(zhí)行上面的流程,每次找出剩余元素中最大的,遍歷完后,數(shù)組是升序的
算法分析:總共需要進(jìn)行l(wèi)ength * (length - 1) / 2 次比較,所以時(shí)間復(fù)雜度為O(n^2),因?yàn)橹恍枰幸粋€(gè)存放常量的空間,元素本身在原數(shù)組上進(jìn)行交換,所以空間復(fù)雜度為O(1)
function bubbleSort(array) {
if (!Array.isArray(array)) {
throw new Error('參數(shù)必須為數(shù)組');
return;
}
var n = 0, m = 0 // n表示趟數(shù),m表示比較次數(shù)
for (let i = array.length - 1; i > 0; i--) { // 外層for表示遍歷的趟數(shù)
for (let j = 0; j < i; j++) { // 內(nèi)層for表示每趟需要比較的 j 和 j+1 對(duì)應(yīng)的數(shù)
if (arr[j] > arr[j + 1]) {
[arr[j + 1], arr[j]] = [arr[j], arr[j + 1]]
}
m++
}
n++
}
console.log("遍歷趟數(shù)" + n, "比較次數(shù)" + m);//遍歷趟數(shù)8 比較次數(shù)36
return array
}
var arr = [7, 3, 6, 9, 24, 0, 1, 45, 8]
console.log(bubbleSort(arr)); //[0, 1, 3, 6, 7, 8, 9, 24, 45]我們?cè)诿恳惠喲h(huán)中,可以記住最后一次交換的元素,這之后的元素就肯定是已經(jīng)排完序的,這樣可以減少總的循環(huán)次數(shù)
function bubbleSort2(array) {
if (!Array.isArray(array)) {
throw new Error('參數(shù)必須為數(shù)組');
return;
}
var n = 0, m = 0 // n表示趟數(shù),m表示比較次數(shù)
for (var i = array.length - 1; i > 0;) { // 用來(lái)表示遍歷 n-1 趟
var cursor = 0; // 用來(lái)記錄本輪最后一次交換的元素位置
for (var j = 0; j < i; j++) {
if (array[j] > array[j + 1]) {
cursor = j;
[arr[j + 1], arr[j]] = [arr[j], arr[j + 1]]
}
m++
}
n++
i = cursor;
}
console.log("遍歷趟數(shù)" + n, "比較次數(shù)" + m);//遍歷趟數(shù)6 比較次數(shù)29
return array
}
var arr = [7, 3, 6, 9, 24, 0, 1, 45, 8]
console.log(bubbleSort2(arr)); //[0, 1, 3, 6, 7, 8, 9, 24, 45]2、選擇排序
實(shí)現(xiàn)思路
(1)從頭遍歷到尾部,找出所有項(xiàng)中最大的一個(gè)元素
(2)將這個(gè)元素和第一個(gè)元素交換
(3)對(duì)剩下的元素重復(fù)進(jìn)行上面的操作,每次找出剩余中最大的最后的數(shù)組是降序排列的
(4) 算法分析
總共需要進(jìn)行l(wèi)ength * (length - 1) / 2 次比較,所以時(shí)間復(fù)雜度為O(n^2),因?yàn)橹恍枰袃蓚€(gè)存放常 量的空間,元素本身在原數(shù)組上進(jìn)行交換,所以空間復(fù)雜度為O(1)
function selectSort(array) {
if (!Array.isArray(array)) {
throw new Error('參數(shù)必須為數(shù)組');
return;
}
for (let i = 0; i < array.length; i++) {
var maxIndex = i, maxValue = array[i] // 設(shè)置i為最大元素下標(biāo)
// 找出剩下元素中的最大值,第一次循環(huán)找出最大值
for (let j = i + 1; j < array.length; j++) {
if (array[j] > maxValue) {
maxIndex = j
maxValue = array[j]
}
}
// 如果剩下的元素中最大值下標(biāo)大于i則發(fā)生交換
if (maxIndex > i) {
[array[i], array[maxIndex]] = [array[maxIndex], array[i]]
}
}
return array
}
var arr = [7, 3, 6, 9, 24, 0, 1, 45, 8]
console.log(selectSort(arr)); //[45, 24, 9, 8, 7, 6, 3, 1, 0]3、插入排序
實(shí)現(xiàn)思路
(1)將數(shù)組前面部分看做有序數(shù)組
(2)每次將后面部分的第一個(gè)與已排序數(shù)組作比較,插入到合適的位置
(3)有序數(shù)組初始狀態(tài)有1個(gè)數(shù)字
(4)算法分析
(5)時(shí)間復(fù)雜度為O(n^2)
function insertSort(array) {
if (!Array.isArray(array)) {
throw new Error('參數(shù)必須為數(shù)組');
return;
}
for (var i = 1; i < array.length; i++) {
var temp = array[i] //當(dāng)前值
for (var j = i; j > 0 && temp < array[j - 1]; j--) {
// 當(dāng)前值和之前的每個(gè)值進(jìn)行比較,發(fā)現(xiàn)有比當(dāng)前值小的值就進(jìn)行重新賦值
array[j] = array[j - 1];
}
array[j] = temp;
}
return array;
}
var arr = [7, 3, 6, 9, 24, 0, 1, 45, 8]
console.log(insertSort(arr)); //[45, 24, 9, 8, 7, 6, 3, 1, 0]4、快速排序
算法思想:將數(shù)組的第一個(gè)數(shù)字作為基準(zhǔn),最后使得基準(zhǔn)數(shù)字位于數(shù)組中間某個(gè)位置,它的左邊的數(shù)字都比它小,它的右邊的數(shù)字都比它大。
算法實(shí)現(xiàn):設(shè)置兩個(gè)分別指向數(shù)組頭部和尾部的指針i和j,首先向左移動(dòng)j,使得array[j] 小于基準(zhǔn)。然后向右移動(dòng)i,使得array[i] 大于基準(zhǔn),交換這兩個(gè)元素。當(dāng)i 和j 的值相等時(shí),交換基準(zhǔn)與位置i上的元素,然后對(duì)i左邊以及右邊的元素分別進(jìn)行快速排序。
function quickSort(array) {
const sort = function (arr, left = 0, right = arr.length - 1) {
if (left >= right) {// 遞歸退出條件
return
}
let i = left, j = right // 定義兩個(gè)指針
let pivot = arr[i] // 定義基準(zhǔn)數(shù)據(jù)
while (i < j) { // 把所有比基準(zhǔn)數(shù)
while (j > i && arr[j] >= pivot) { //找到一個(gè)比基準(zhǔn)值小的數(shù)位置為j
j--
}
arr[i] = arr[j] // 將j的值給了i位置的元素,此時(shí)j位置還是原來(lái)的數(shù)
while (i < j && arr[i] < pivot) {
i++
}
arr[j] = arr[i] // 將i位置的值給了j位置的元素,此時(shí)i的位置還是原來(lái)的數(shù)
}
// 本次交換完畢,此時(shí)ij兩個(gè)指針重合,把基準(zhǔn)值賦值給i即可
arr[i] = pivot
sort(arr, left, j - 1) // 將左邊的無(wú)序數(shù)組重復(fù)上面的操作
sort(arr, j + 1, right) // 將右邊的無(wú)序數(shù)組重復(fù)上面的操作
}
const newArr = array.concat() // 為了保證這個(gè)函數(shù)是純函數(shù)拷貝一次數(shù)組
sort(newArr)
return newArr
}
var arr = [7, 3, 6, 9, 24, 0, 1, 45, 8]
console.log(quickSort(arr)); //[0, 1, 3, 6, 7, 8, 9, 24, 45]到此這篇關(guān)于JavaScript實(shí)現(xiàn)基礎(chǔ)排序算法的示例詳解的文章就介紹到這了,更多相關(guān)JavaScript排序算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
js實(shí)現(xiàn)鼠標(biāo)拖動(dòng)圖片并兼容IE/FF火狐/谷歌等主流瀏覽器
js實(shí)現(xiàn)鼠標(biāo)拖動(dòng)圖片做了兼容IE,F(xiàn)F火狐,谷歌等主流瀏覽器,具體實(shí)現(xiàn)代碼如下,感興趣的朋友可以參考下哈,希望對(duì)你有所幫助2013-06-06
微信小程序按鈕點(diǎn)擊動(dòng)畫效果的實(shí)現(xiàn)
這篇文章主要介紹了微信小程序按鈕點(diǎn)擊動(dòng)畫效果的實(shí)現(xiàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09
Javascript oop設(shè)計(jì)模式 面向?qū)ο缶幊毯?jiǎn)單實(shí)例介紹
這篇文章主要介紹了Javascript oop設(shè)計(jì)模式 面向?qū)ο缶幊毯?jiǎn)單實(shí)例介紹的相關(guān)資料,這里附有實(shí)例代碼幫助大家學(xué)習(xí)理解,需要的朋友可以參考下2016-12-12
Sample script that displays all of the users in a given SQL
Sample script that displays all of the users in a given SQL Server DB...2007-06-06
淺談webpack devtool里的7種SourceMap模式
這篇文章主要介紹了淺談webpack devtool里的7種SourceMap模式,主要介紹了這7種模式的使用和打包編譯后的結(jié)果的不同,非常具有實(shí)用價(jià)值,有興趣的可以了解一下2019-01-01
js的壓縮及jquery壓縮探討(提高頁(yè)面加載性能/保護(hù)勞動(dòng)成果)
搞定js的加密和壓縮,一方面可以提高頁(yè)面加載性能,另外一方面也希望辛苦研發(fā)出來(lái)的成果得到一定的保護(hù),感興趣的朋友可以了解下,或許對(duì)你有所幫助2013-01-01
JS中隊(duì)列和雙端隊(duì)列實(shí)現(xiàn)及應(yīng)用詳解
這篇文章主要介紹了JS中隊(duì)列和雙端隊(duì)列實(shí)現(xiàn)及應(yīng)用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
整理Javascript函數(shù)學(xué)習(xí)筆記
整理Javascript函數(shù)學(xué)習(xí)筆記,之前一系列的文章是跟我學(xué)習(xí)Javascript,本文就是進(jìn)一步學(xué)習(xí)Javascript函數(shù),希望大家繼續(xù)關(guān)注2015-12-12

