排序算法 —— 冒泡排序
基本思想
n個元素,從第1個開始,依次比較相鄰的兩個是否逆序?qū)?#xff08;大在前,小在后),若逆序就交換兩個元素,即第1個和第2個比,若逆序就交換兩個元素,接著第2個和第3個比,若逆序就交換兩個元素,接著第3個和第4個比,若逆序就交換兩個元素,……,直到n-1和n比較,經(jīng)過一輪比較后,則把最大的元素排到最后,即將最大的元素像冒泡一樣逐步冒到相應(yīng)的位置。原來n個元素的排序問題,轉(zhuǎn)換為n-1個元素的排序問題。第二輪從第1個開始,依次比較相鄰的兩個元素是否逆序?qū)?#xff0c;若逆序就交換兩個元素,知道n-2和n-1比較。如此,進(jìn)行n-1輪后,隊(duì)列為有序的隊(duì)列。
具體步驟
1.讀入數(shù)據(jù)存放在a數(shù)組中。
2.比較相鄰的前后兩個數(shù)據(jù),如果前面數(shù)據(jù)大于后面的數(shù)據(jù),就將兩個數(shù)據(jù)交換。
3.對數(shù)組的第0個數(shù)據(jù)到n-1個數(shù)據(jù)進(jìn)行一次遍歷后,最大的一個數(shù)據(jù)就“冒”到數(shù)組的第n-1個位置。
4.n=n-1,如果n不為0就重復(fù)前面兩步,否則排序完成。
實(shí)現(xiàn)方法
程序用兩層循環(huán)完成算法,外層循環(huán)i控制每輪要進(jìn)行多少次的比較,第1輪比較n-1次,第2輪比較n-2次,……,最后一次比較1次。內(nèi)層循環(huán)j控制每輪i次比較相鄰兩個元素是否逆序,若逆序就交換這兩個元素。
程序代碼
#include <iostream> using namespace std; int main () {int n,temp,array[1000];cin>>n;array[0]=n;for(int i=1;i<=n;i++){cin>>array[i];}for(int i=1;i<n;i++){bool ok=true;for(int j=1;j<=n-i;j++){if(array[j]>array[j+1]){ok=false;temp=array[j+1];array[j+1]=array[j];array[j]=temp;}}if(ok) break;}for(int i=1;i<=n;i++){cout<<array[i]<<' ';}return 0; }測試
#include <iostream> #include <cstdio> #include <cstdlib> #include <ctime> using namespace std; int main () {int n,temp,array[1000]; // cin>>n; // array[0]=n; // for(int i=1;i<=n;i++) // { // cin>>array[i]; // }n=1000;srand(time(NULL));for (int i=1;i<=n;i++)array[i]=rand()%10000;for(int i=1;i<n;i++){bool ok=true;for(int j=1;j<=n-i;j++){if(array[j]>array[j+1]){ok=false;temp=array[j+1];array[j+1]=array[j];array[j]=temp;}}if(ok) break;}for(int i=1;i<=n;i++){cout<<array[i]<<' ';}cout<<endl;printf("Time used = %.7lf",(double)clock()/CLOCKS_PER_SEC);return 0; }算法分析
時間復(fù)雜度
若文件的初始狀態(tài)是正序的,一趟掃描即可完成排序。
所需的關(guān)鍵字比較次數(shù)C和記錄移動次數(shù)M均達(dá)到最小值:Cmin=n-1,Mmin=0。
所以,冒泡排序最好的時間復(fù)雜度為O(n)。
若初始文件是反序的,需要進(jìn)行n-1趟排序。
每趟排序要進(jìn)行n-i次關(guān)鍵字的比較(1≤i≤n-1),且每次比較都必須移動記錄三次來達(dá)到交換記錄位置。在這種情況下,比較和移動次數(shù)均達(dá)到最大值:
冒泡排序的最壞時間復(fù)雜度為O(n2)。
綜上,因此冒泡排序總的平均時間復(fù)雜度為O(n2)。
算法穩(wěn)定性
冒泡排序就是把小的元素往前調(diào)或者把大的元素往后調(diào)。
比較是相鄰的兩個元素比較,交換也發(fā)生在這兩個元素之間。
所以,如果兩個元素相等,是不會再交換的;如果兩個相等的元素沒有相鄰,那么即使通過前面的兩兩交換把兩個相鄰起來,這時候也不會交換,所以相同元素的前后順序并沒有改變,所以冒泡排序是一種穩(wěn)定排序算法。
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的排序算法 —— 冒泡排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 排序算法 —— 选择排序
- 下一篇: 排序算法 —— 插入排序