日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

排序算法 —— 冒泡排序

發(fā)布時間:2024/4/30 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 排序算法 —— 冒泡排序 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

基本思想

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。