其實我是沒打算寫這個算法的,你也看出來了,不是嗎。
不過我今天看到了一個實現,覺得很有意思,不妨討論一下。
冒泡排序的核心就是:假設需要非降序排列,然后相鄰元素比較,若左大于右,就交換。寫出來就是:
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]);
}
}
之所以叫冒泡排序,就是因為每執行一次排序,就把一個最大的元素浮出去。
不過我今天看了一個實現,就很有意思。我寫一下:
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;
}
}
}
這段代碼就很有意思,盡管道理上沒有什么改變,不過它卻削弱了冒泡的含義,相反,它的想法是,消除每一個逆序對,我之前的文章也寫過什么是逆序對,就不說了。而代碼停下的依據也是整個序列中不存在逆序對,這是標志著排序的sorted就是true了。
而外層for循環的判斷結構上也很巧妙,我們知道繼續循環的條件是滿足條件,就是“條件為真”,所以當序列中有逆序對的時候,sorted == false
,而進入循環后,因為sorted = !sorted
,sorted就被設為了true,只有排列中不存在逆序時,sorted才會保留true,進而在外層判斷時被賦值為false,不滿足條件,結束循環。
本文沒有什么特殊含義,就是看到了一個不錯的實現,想分享一下。