JavaScript冒泡排序算法
JS冒泡排序由于比較簡單和容易理解,往往會成為人們首先想到的排序算法。最基本的想法就是在一次里面比較兩個數字,并且確保他們在移動到其他項目之前有一個正確的順序。在每一關結束,有價值的“排序”到正確的位置,最終只留下其他項目排序。
算法實現思路
- 對比第一項和第二項
- 如果第一項應該在第二項的后面,交換他們
- 對比第二項和第三項
- 如果第二項應該在第三項之后,交換他們
- 持續直到數據結束
這個過程就是重復數次直到數據完全排序完畢,在每一次循環中,由于每一次的最后一項都是正確的排序,所以排序的項就越來越少。為了更好的理解,我們來進行一個數組對比一下:[3, 2, 4, 5, 1].
例子對比過程
- 首先是正排序,對比第一項和第二項,由于2比3小,所以3排到后面,結果是[2,3,4,5,1].
- 第二項和第三項,順序是正確的,無須交換;第三項和第四項也是正確的,無須交換,第四項和第五項交換,結果為[2,3,4,1,5].
- 再次循環第一項和第二項,依次到第三項和第四項交換,為[2,3,1,4,5]
- 第三次循環,第二和第三交換為[2,1,3,4,5]
- 第四次循環,第一和第二交換為[1,2,3,4,5]
實現冒泡排序的第一步就是創建一個方法來交換數組里面的兩項,這個方法在很多低效率的排序中是比較常見的。一個簡單的JavaScript實現代碼為:
function swap(items, firstIndex, secondIndex){
var temp = items[firstIndex];
items[firstIndex] = items[secondIndex];
items[secondIndex] = temp;
}
如上所述,這個排序算法由于需要進行多次的排序,效率是比較低的。假設一個數組有n個項,那么則需要2的n次方來計算,讓我們來看看這個
正向冒泡算法
function bubbleSort(items){
var len = items.length,
i, j, stop;
for (i=0; i < len; i++){
for (j=0, stop=len-i; j < stop; j++){
if (items[j] > items[j+1]){
swap(items, j, j+1);
}
}
}
return items;
}
外面的循環是控制了循環周期數,里面的循環則是項與項之間的排序比較。
反向冒泡排序
function bubbleSort(items){
var len = items.length,
i, j;
for (i=len-1; i >= 0; i--){
for (j=len-i; j >= 0; j--){
if (items[j] < items[j-1]){
swap(items, j, j-1);
}
}
}
return items;
}
上面兩個代碼的結果是一樣的,都是從小到大排序,只是循環的順序略有不同,都是正序冒泡。
反序冒泡排序
其實就是判斷大小改變,第一項小于第二項時,交換位置,依次類推。
function bubbleSort2(items){
var len = items.length,
i,j,stop;
for(i=0;i<len; i++){
for(j=0,stop=len-i;j<stop;j++){
if(items[j]<items[j+1]){
swap(items,j,j+1);
}
}
}
return items;
}
代碼演示
演示地址
總結
再次說明一下,JS冒泡排序可能并不適用于你的實際工作中哦,它只是一個簡單的工具幫助我們了解算法并且為進一步獲取更多的知識打下基礎。而我們用得最多的可能是內置的Array.prototype.sort() 原型方法,這是由于它具有更高效率。
發現研究這些算法也挺有意思的,后面我將繼續與大家分享更多的JavaScript算法知識,歡迎朋友們登錄留言,與前端博客一起交流這方面的知識。本文為前端博客原創內容,轉載的朋友請看底部轉載聲明。
總結
以上是生活随笔為你收集整理的JavaScript冒泡排序算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js构造函数的方法与原型prototyp
- 下一篇: 光纤收发器如何连接路由器接收光纤后如何装