其實我是沒打算寫這個算法的算谈,你也看出來了疾党,不是嗎榴鼎。
不過我今天看到了一個實現(xiàn),覺得很有意思,不妨討論一下。
冒泡排序的核心就是:假設(shè)需要非降序排列庐杨,然后相鄰元素比較,若左大于右夹供,就交換灵份。寫出來就是:
void bsort(int a[], int n)
{
for (int j = n-1; j >= 0; --j)
for (int i = 1; i <= j; ++i)
{
if (a[i-1] > a[i])
swap(a[i-1], a[i]);
}
}
之所以叫冒泡排序,就是因為每執(zhí)行一次排序哮洽,就把一個最大的元素浮出去填渠。
不過我今天看了一個實現(xiàn),就很有意思袁铐。我寫一下:
void bsort(int a[], int n)
{
for (bool sorted = false; sorted = !sorted; --n)
for (int i = 1; i < n; ++i)
{
if (a[i-1] > a[i])
{
swap(a[i-1], a[i]);
sorted = false;
}
}
}
這段代碼就很有意思揭蜒,盡管道理上沒有什么改變横浑,不過它卻削弱了冒泡的含義剔桨,相反,它的想法是徙融,消除每一個逆序?qū)θ髯海抑暗奈恼乱矊戇^什么是逆序?qū)Γ筒徽f了。而代碼停下的依據(jù)也是整個序列中不存在逆序?qū)κ骷ǎ@是標(biāo)志著排序的sorted就是true了萨脑。
而外層for循環(huán)的判斷結(jié)構(gòu)上也很巧妙,我們知道繼續(xù)循環(huán)的條件是滿足條件饺饭,就是“條件為真”渤早,所以當(dāng)序列中有逆序?qū)Φ臅r候,sorted == false
瘫俊,而進入循環(huán)后鹊杖,因為sorted = !sorted
,sorted就被設(shè)為了true扛芽,只有排列中不存在逆序時骂蓖,sorted才會保留true,進而在外層判斷時被賦值為false川尖,不滿足條件登下,結(jié)束循環(huán)。
本文沒有什么特殊含義叮喳,就是看到了一個不錯的實現(xiàn)被芳,想分享一下。