說明
對數(shù)組進(jìn)行 冒泡排序 算是比較簡單的,冒泡排序也是容易理解的一種排序算法了,在面試的時候,很可能就會問到。
實(shí)現(xiàn)原理數(shù)組中有 n 個數(shù),比較每相鄰兩個數(shù),如果前者大于后者,就把兩個數(shù)交換位置;這樣一來,第一輪就可以選出一個最大的數(shù)放在最后面;那么經(jīng)過 n-1(數(shù)組的 length - 1) 輪,就完成了所有數(shù)的排序。
好的,我們先來實(shí)現(xiàn)找數(shù)組中的最大數(shù),并把他放到數(shù)組最后。
var arr = [3,4,1,2]; // 遍歷數(shù)組,次數(shù)就是arr.length - 1 for (var i = 0; i < arr.length - 1; i++) { // 如果前一個數(shù) 大于 后一個數(shù) 就交換兩數(shù)位置 if (arr[i] > arr[i + 1]) { var temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; } } console.log(arr) // [3, 1, 2, 4]
我們能找到數(shù)組中最大的數(shù),放到最后,這樣重復(fù) arr.length - 1 次,便可以實(shí)現(xiàn)數(shù)組按從小到大的順序排好了。
var arr = [3,4,1,2]; // 遍歷數(shù)組,次數(shù)就是arr.length - 1 for (var j = 0; j < arr.length - 1; j++) { // 這里 i < arr.length - 1 ,要思考思考合適嗎?我們下面繼續(xù)說 for (var i = 0; i < arr.length - 1; i++) { if (arr[i] > arr[i + 1]) { var temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; } } } console.log(arr) // [1,2,3,4]
雖然上面的代碼已經(jīng)實(shí)現(xiàn)冒泡排序了,但就像注釋中提到的,內(nèi)層 for 循環(huán)的次數(shù)寫成,i < arr.length - 1 ,是不是合適呢?
我們想一下,當(dāng)?shù)谝淮危业阶畲髷?shù),放到最后,那么下一次,遍歷的時候,是不是就不能把最后一個數(shù)算上了呢?因?yàn)樗褪亲畲蟮牧耍粫霈F(xiàn),前一個數(shù)比后一個數(shù)大,要交換位置的情況,所以內(nèi)層 for 循環(huán)的次數(shù),改成 i < arr.length - 1 -j ,才合適,看下面的代碼。
var arr = [3, 4, 1, 2]; function bubbleSort (arr) { for (var j = 0; j < arr.length - 1; j++) { // 這里要根據(jù)外層for循環(huán)的 j,逐漸減少內(nèi)層 for循環(huán)的次數(shù) for (var i = 0; i < arr.length - 1 - j; i++) { if (arr[i] > arr[i + 1]) { var temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; } } } return arr; } bubbleSort(arr);
我們想下這個情況,當(dāng)原數(shù)組是,
arr = [1,2,4,3];
在經(jīng)過第一輪冒泡排序之后,數(shù)組就變成了
arr = [1,2,3,4];
此時,數(shù)組已經(jīng)排序完成了,但是按上面的代碼來看,數(shù)組還會繼續(xù)排序,所以我們加一個標(biāo)志位,如果某次循環(huán)完后,沒有任何兩數(shù)進(jìn)行交換,就將標(biāo)志位 設(shè)置為 true,表示排序完成,這樣我們就可以減少不必要的排序,提高性能。
var arr = [3, 4, 1, 2]; function bubbleSort (arr) { var max = arr.length - 1; for (var j = 0; j < max; j++) { // 聲明一個變量,作為標(biāo)志位 var done = true; for (var i = 0; i < max - j; i++) { if (arr[i] > arr[i + 1]) { var temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; done = false; } } if (done) { break; } } return arr; } bubbleSort(arr);性能
時間復(fù)雜度: 平均時間復(fù)雜度O(n*n) 、最好情況O(n)、最差情況O(n*n)
空間復(fù)雜度: O(1)
穩(wěn)定性:穩(wěn)定
時間復(fù)雜度指的是一個算法執(zhí)行所耗費(fèi)的時間
空間復(fù)雜度指運(yùn)行完一個程序所需內(nèi)存的大小
穩(wěn)定指,如果a=b,a在b的前面,排序后a仍然在b的前面
不穩(wěn)定指,如果a=b,a在b的前面,排序后可能會交換位置
1、外層 for 循環(huán)控制循環(huán)次數(shù)
2、內(nèi)層 for 循環(huán)進(jìn)行兩數(shù)交換,找每次的最大數(shù),排到最后
3、設(shè)置一個標(biāo)志位,減少不必要的循環(huán)
好的,下一篇文章,來實(shí)現(xiàn)下冒泡排序的可視化,把冒泡排序的過程展示出來。
JavaScript實(shí)現(xiàn)冒泡排序 可視化
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/93970.html
摘要:之所以把冒泡排序選擇排序插入排序放在一起比較,是因?yàn)樗鼈兊钠骄鶗r間復(fù)雜度都為。其中,冒泡排序就是原地排序算法。所以冒泡排序是穩(wěn)定的排序算法。選擇排序思路選擇排序算法的實(shí)現(xiàn)思路有點(diǎn)類似插入排序,也分已排序區(qū)間和未排序區(qū)間。 showImg(https://segmentfault.com/img/bVbuvnj?w=900&h=250); 1. 前言 算法為王。 想學(xué)好前端,先練好內(nèi)功,...
摘要:說明上次寫了實(shí)現(xiàn)冒泡排序,只是簡單的說了冒泡排序算法是什么,怎么實(shí)現(xiàn),這次來實(shí)現(xiàn)將冒泡排序的過程展現(xiàn)出來。總結(jié)上面的兩個版本的思路基本一樣,用一句話概括就是,記錄冒泡排序所有的改變,將這些改變一步一步的顯示出來。 說明 上次寫了 JavaScript實(shí)現(xiàn)冒泡排序 ,只是簡單的說了冒泡排序算法是什么,怎么實(shí)現(xiàn),這次來實(shí)現(xiàn)將冒泡排序的過程展現(xiàn)出來。 解釋 先來個簡單的版本,看效果圖 sh...
摘要:實(shí)現(xiàn)快速排序介紹通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序,整個排序過程可以遞歸進(jìn)行,以此達(dá)到整個數(shù)據(jù)變成有序序列。 冒泡排序 介紹 重復(fù)遍歷要排序的元素列,依次比較兩個相鄰的元素,前一個元素若比后一個元素大則互換位置。以升序排序?yàn)槔畲蟮脑貢诘谝淮伪闅v后冒泡到數(shù)組的末端。假如數(shù)組...
摘要:冒泡排序可謂是最經(jīng)典的排序算法了,它是基于比較的排序算法,其優(yōu)點(diǎn)是實(shí)現(xiàn)簡單,排序數(shù)量較小時性能較好。也可以實(shí)現(xiàn)大數(shù)放在前面,小數(shù)放在后面,如果前面的數(shù)據(jù)比后面的小,就交換兩個的位置。要實(shí)現(xiàn)上述規(guī)則需要用到兩層循環(huán)。 冒泡排序可謂是最經(jīng)典的排序算法了,它是基于比較的排序算法,其優(yōu)點(diǎn)是實(shí)現(xiàn)簡單,排序數(shù)量較小時性能較好。 算法原理 相鄰的數(shù)據(jù)進(jìn)行兩兩比較,小數(shù)放在前面,大數(shù)放在后面,如果前面...
摘要:筆者寫的數(shù)據(jù)結(jié)構(gòu)與算法之美系列用的語言是,旨在入門數(shù)據(jù)結(jié)構(gòu)與算法和方便以后復(fù)習(xí)。這應(yīng)該是目前較為簡單的十大經(jīng)典排序算法的文章講解了吧。比如原本在的前面,而,排序之后,在的后面十大經(jīng)典排序算法冒泡排序思想冒泡排序只會操作相鄰的兩個數(shù)據(jù)。 showImg(https://segmentfault.com/img/bVbvHet); 1. 前言 算法為王。想學(xué)好前端,先練好內(nèi)功,內(nèi)功不行,就...
閱讀 3885·2021-11-17 09:33
閱讀 1196·2021-10-09 09:44
閱讀 400·2019-08-30 13:59
閱讀 3478·2019-08-30 11:26
閱讀 2178·2019-08-29 16:56
閱讀 2849·2019-08-29 14:22
閱讀 3151·2019-08-29 12:11
閱讀 1269·2019-08-29 10:58