作為一個程序員回俐,一些基本的排序算法是必須要掌握的逛腿。以前人們總覺得算法是后端程序員去學(xué)的,前端只需要專注于網(wǎng)頁的美觀以及 JS 的基本邏輯交互就行仅颇,然而单默,近幾年隨著前端行業(yè)的發(fā)展,前端越來越注重邏輯交互忘瓦,如果你還像很久之前那樣只知道用 HTML + CSS 去構(gòu)建網(wǎng)頁搁廓,那就落伍了。如今耕皮,前端程序員也需要對算法有一定的了解境蜕,不說別的,多掌握點東西總是好的明场。這篇文章記錄下很常見的一種排序算法——冒泡排序汽摹,文章不會太長,方便你快速看完苦锨。
什么是排序
維基百科中這樣說明:一種能將一串?dāng)?shù)據(jù)依照特定排序方式進行排列的一種算法逼泣。生活中也有很多排序的例子:超市購物排隊,學(xué)生成績排序舟舒,班級座位排序等拉庶。排序可以分為內(nèi)部排序還有外部排序。內(nèi)部排序是指待排序列完全存放在內(nèi)存中所進行的排序過程秃励,適合不太大的元素序列氏仗;外部排序能夠處理極大量數(shù)據(jù)的排序算法,通常需要結(jié)合外存儲器(硬盤)使用夺鲜。下圖是排序的分類皆尔,下面的冒泡排序就屬于交換排序的一種。
什么是冒泡排序
顧名思義币励,冒泡排序就是比較一個待排序的數(shù)組中相鄰的兩個數(shù)慷蠕,如果一個數(shù)大于它后面的數(shù),那就將它們交換食呻,這樣較大的數(shù)就被“冒泡”到后面了流炕,所以第一次冒泡排序后澎现,第一個數(shù)肯定是數(shù)組中最大的數(shù),接著數(shù)組中較大的數(shù)會不斷排到后面去每辟,這就是冒泡排序剑辫。
實現(xiàn)代碼
下面是冒泡排序的代碼,由于比較的是相鄰兩個數(shù)渠欺,所以只需比較到倒數(shù)第二個元素妹蔽,最后一個元素例外,因此i = arr.length - 1
.
function bubbleSort(arr){
console.time('冒泡排序耗時: ');
var i = arr.length - 1;
while(i>0){
var pos = 0; // 標(biāo)記每次排序的位置峻堰,這樣只需循環(huán)到這里讹开,后面的數(shù)已排好
for(var j=0;j<i;j++){
if(arr[j] > arr[j+1]){
pos = j;
var temp = arr[j]; // 交換兩個數(shù)
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
i = pos; // 準(zhǔn)備下一次排序
}
console.timeEnd('冒泡排序耗時: ');
return arr;
}
var arr=[9,2,38,4,16,36,22,68,46,1,42,48];
console.log(bubbleSort(arr)); // 冒泡排序耗時: : 0.27294921875ms
// 1, 2, 4, 9, 16, 22, 36, 38, 42, 46, 48, 68
也許上面的代碼看著不是很懂盅视,沒關(guān)系捐名,算法代碼這種東西不是看一次就能懂的,大神忽略闹击,多看幾遍多學(xué)習(xí)镶蹋,一定能有所收獲。
時間和空間復(fù)雜度
最好的情況:T(n) = O(n)
最壞的情況:T(n) = O(n2)
平均時間復(fù)雜度是:T(n) = O(n2)
空間復(fù)雜度為:O(1)
參考博客: https://blog.csdn.net/jizhen_tan/article/details/52555639
最近在網(wǎng)上看到了一段代碼赏半,很有意思贺归,代碼如下:
.red{
color: red;
}
.blue{
color: blue;
}
<div class="red blue"></div>
<div class="blue red"></div>
猜猜兩個 div 各自的顏色,可以把你認(rèn)為的結(jié)果發(fā)到后臺断箫。
PS:接下來更新的會是基本的排序算法系列拂酣,感興趣的可以持續(xù)關(guān)注下,由于公眾號沒有留言的功能仲义,有什么意見建議或者聊天吹水的可以在進入公眾號的頁面發(fā)婶熬,一起交流探討。