氣泡排序演算法,是最基本的排序演算法, 它屬於交換排序。
設想被排序的陣列r[1..n]垂直豎立,將每個資料元素看作有重量的氣泡,根據輕氣泡不能在重氣泡之下的原則,從下往上掃瞄陣列r,凡掃瞄到違反本原則的輕氣泡,就使其向上"漂浮"(交換位置),如此反覆進行,直至最後任何兩個氣泡都是輕者在上,重者在下為止。
若記錄序列的初始狀態為"正序",則氣泡排序過程只需進行一趟排序,在排序過程中只需進行n-1次比較,且不移動記錄;反之,若記錄序列的初始狀態為"逆序",則需進行n(n-1)/2次比較和記錄移動。因此氣泡排序總的時間複雜度為o(n*n)。
根據掃瞄方向不同,實現略有不同。
**如下:
[cpp]view plain
copy
void
bubblesort_1(
inta,
intsize)
} } }
如果上面**中,裡面一層迴圈在某次掃瞄中沒有執行交換,則說明此時陣列已經全部有序列,無需再掃瞄了。因此,增加乙個標記,每次發生交換,就標記,如果某次迴圈完沒有標記,則說明已經完成排序。
[cpp]view plain
copy
void
bubblesort_2(
inta,
intsize)
} // 如果上一次掃瞄沒有發生交換,則說明陣列已經全部有序,退出迴圈
if(!bswaped)
break
; }
}
[cpp]view plain
copy
"code"
class
="cpp"
>
void
bubblesort_3(
inta,
intsize)
} ifbreak
; }
}
下面是兩種一般冒泡演算法和雙向冒泡演算法的對比:
#include "stdafx.h"
#include
#include
//一般的氣泡排序
void
bubblesort(
int
a,
int
n)
}
printf(
"第%d次排序結果:"
, i + 1);
for
(k = 0; k < n; k++)
//printf("\n");
}
printf(
"最終排序結果: "
);
for
(k = 0; k < n; k++)
}
//改進版的氣泡排序(雙向冒泡)
void
bidbubblesort(
int
a,
int
n)
}
right = r;
//第二次迴圈將最小的值放到了開頭
for
(j = right; j > left; j--)
}
left = l;
printf(
"第%d次排序結果:"
, i + 1);
i++;
for
(j = 0; j < n; j++)
}
printf(
"最終排序結果: "
);
for
(j = 0; j < n; j++)
}
int
_tmain(
int
argc, _tchar* argv)
;
bubblesort(score1, 8);
printf(
"\n"
);
int
score2 = ;
bidbubblesort(score2, 8);
system(
"pause"
);
return
0;
}
下面是執行效果:
可見,雙向氣泡排序能大大減少排序的次數,值得借鑑!!!
排序演算法 氣泡排序(改進)
假如我們運氣好,用了1輪就已經將整個序列排序好了,整個數列已然是有序的了。可是我們的排序演算法仍然 兢兢業業 地繼續執行第2輪 第3輪 直至n 1輪,這就很沒必要。也就是說如果序列已經有序,每一輪排序還是會繼續比較相鄰的元素,這就相當於做了一些沒用的操作。這種情況下,如果我們能判斷出數列已經有序,並...
改進的氣泡排序演算法
氣泡排序演算法,是最基本的排序演算法,它屬於交換排序。設想被排序的陣列r 1.n 垂直豎立,將每個資料元素看作有重量的氣泡,根據輕氣泡不能在重氣泡之下的原則,從下往上掃瞄陣列r,凡掃瞄到違反本原則的輕氣泡,就使其向上 漂浮 交換位置 如此反覆進行,直至最後任何兩個氣泡都是輕者在上,重者在下為止。若記...
排序演算法 氣泡排序的首尾改進
在排序演算法中,氣泡排序是乙個很經典的演算法,最初的氣泡排序一直要執行n 1次,但是其中有些事不必要的操作,例 如,當沒有兩個資料發生交換時,就可以結束執行。本文介紹的一種方法是對上述條件的改進,即不僅對尾資料進行條件判斷,同時還對頭資料進行條件判斷,當頭資料不發生交換時需要完成一些改進,下面給出實...