改進的氣泡排序演算法

2021-07-12 04:43:10 字數 3190 閱讀 2355

氣泡排序演算法,是最基本的排序演算法, 它屬於交換排序。

設想被排序的陣列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

//一般的氣泡排序

voidbubblesort(inta,intn)

}

printf("第%d次排序結果:", i + 1);

for(k = 0; k < n; k++)

//printf("\n");

}

printf("最終排序結果: ");

for(k = 0; k < n; k++)

}

//改進版的氣泡排序(雙向冒泡)

voidbidbubblesort(inta,intn)

}

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(intargc, _tchar* argv)

;

bubblesort(score1, 8);

printf("\n");

intscore2 = ;

bidbubblesort(score2, 8);

system("pause");

return0;

}

下面是執行效果:

可見,雙向氣泡排序能大大減少排序的次數,值得借鑑!!!

排序演算法 氣泡排序(改進)

假如我們運氣好,用了1輪就已經將整個序列排序好了,整個數列已然是有序的了。可是我們的排序演算法仍然 兢兢業業 地繼續執行第2輪 第3輪 直至n 1輪,這就很沒必要。也就是說如果序列已經有序,每一輪排序還是會繼續比較相鄰的元素,這就相當於做了一些沒用的操作。這種情況下,如果我們能判斷出數列已經有序,並...

改進的氣泡排序演算法

氣泡排序演算法,是最基本的排序演算法,它屬於交換排序。設想被排序的陣列r 1.n 垂直豎立,將每個資料元素看作有重量的氣泡,根據輕氣泡不能在重氣泡之下的原則,從下往上掃瞄陣列r,凡掃瞄到違反本原則的輕氣泡,就使其向上 漂浮 交換位置 如此反覆進行,直至最後任何兩個氣泡都是輕者在上,重者在下為止。若記...

排序演算法 氣泡排序的首尾改進

在排序演算法中,氣泡排序是乙個很經典的演算法,最初的氣泡排序一直要執行n 1次,但是其中有些事不必要的操作,例 如,當沒有兩個資料發生交換時,就可以結束執行。本文介紹的一種方法是對上述條件的改進,即不僅對尾資料進行條件判斷,同時還對頭資料進行條件判斷,當頭資料不發生交換時需要完成一些改進,下面給出實...