一、簡述
氣泡排序(Bubble Sort)是一種電腦科學領域的較簡單的排序演算法。它重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果二者的順序(如從大到小、首字母從A到Z)錯誤就交換。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素列已經排序完成。這個演算法名字的由來是因為越大的元素會經由交換慢慢“浮”到數列的頂端(升序或降序排列),就如同碳酸飲料中二氧化碳的氣泡最終會上浮到頂端一樣,故名“氣泡排序”。
第一種:常規方法氣泡排序
比較相鄰的兩個元素,如果前一個比後一個大,則交換位置。
第一輪把最大的元素放到了最後面。
由於每次排序最後一個都是最大的,所以之後按照步驟1排序最後一個元素不用比,最理想的情況是已經按順序排好的佇列,只需要掃描一次就結束並且不需要做任何位置交換,複雜度為O(n); 最差為O(n2)
function bubbleSort(data){
if(data.length<1) return data;
let n = data.length;
for(let i=0;i<n;i++){
//因為掃描完一次後,最後一個不用比了,所以要n-i進行邊界處理,達到最佳化效能目的
for(let j=0;j<n-i; j++){
if(data[j]>data[j+1]){
// 交換函式
let swap = data[j];
data[j] = data[j+1];
data[j+1] = swap;
}
}
}
return data;
}
第二種: 對氣泡排序的改進
宣告一個變數標記順序是否發生變化
function bubbleSort(data){
let n = data.length;
let flag = true
let swap
// 只要存在位置更換就進入迴圈
while(flag){
flag = false
// 每次排序最後一個都是最大的, 所有迴圈結束後,就得到了升序佇列。
for(let i=0;i<n;i++){
if(data[i]>data[i+1]){
// 交換函式
swap = data[i]
data[i] = data[i+1]
data[i+1] = swap;
flag = true;
}
}
// /因為掃描完一次後,最後一個不用比了,所以要n--進行邊界處理,達到最佳化效能目的
n--;
}
return data;
}
第三種: 也是對氣泡排序的一種改進
第一遍排序時將資料分成兩部分,一部分比另一部分的所有資料都要小。然後遞迴呼叫,在兩邊都實行排序。
function bubbleSort(data) {
// 佇列只有一個數或者沒有數,返回原佇列
if(data.length <= 1) {
return data
}
// 在佇列中向取整,找到一個理論上的中間值索引
let pIndex = Math.floor(data.length/2)
// 從原佇列中刪除該中間值,並且取出該值。
let p = data.splice(pIndex, 1)[0]
// 小於中間值的左邊部分
let left = []
// 大於中間值的右邊部分
let right = []
// 透過掃描已經刪除了中間值的佇列,分別得到小於中間值的左邊部分和大於中間值的左邊部分
for(var i = 0; i<data.length; i++) {
if(data[i] < p) {
left.push(data[i])
} else {
right.push(data[i])
}
}
// 分別遞迴左邊,右邊
let nLeft = bubbleSort(left);
let nRight = bubbleSort(right)
// 返回新的佇列
return nLeft.concat([p], nRight);
}