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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

基本算法研究1-冒泡排序算法测试

發(fā)布時間:2023/12/2 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基本算法研究1-冒泡排序算法测试 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

基本算法研究1-冒泡排序算法測試

1、經(jīng)典冒泡排序法基本原理

先看一個動態(tài)圖,感覺比較形象:

? ? ? ? 冒泡排序(Bubble Sort)是一種簡單的排序算法。默認是從小到大排序,即把最大的數(shù)據(jù)排在最后,相當(dāng)于每次把最大數(shù)據(jù)像氣泡一樣浮到水面一樣。它重復(fù)地走訪過要排序的數(shù)列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數(shù)列的工作是重復(fù)地進行直到?jīng)]有再需要交換。

? ? ? ? 基本步驟:

? ? ? ? 1、比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
? ? ? ? 2、對每一對相鄰元素作同樣的工作,從開始第一對到結(jié)尾的最后一對。在這一點,最后的元素應(yīng)該會是最大的數(shù)。
? ? ? ? 3、針對所有的元素重復(fù)以上的步驟,除了最后一個。
? ? ? ? 4、持續(xù)每次對越來越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對數(shù)字需要比較。

?

? ? ? ?最經(jīng)典的冒泡排序法就是兩層For循環(huán)嵌套。外層For循環(huán)是“趟”數(shù),內(nèi)層是每一“趟”對相鄰的兩個數(shù)據(jù)進行大小比較,根據(jù)需要進行交換位置。

int a[SORT_NUM];for (int i=0; i<SORT_NUM; i++)a[i]=arc4random()%SORT_NUM+1;//隨機生成數(shù)組
for (int i=0; i<SORT_NUM; i++)//外層循環(huán){
for (int j=0; j<SORT_NUM-i-1; j++)//內(nèi)層循環(huán){
if (a[j]>a[j+1])//交換數(shù)據(jù){int temp=a[j];a[j]=a[j+1];a[j+1]=temp;} }}

2、冒泡排序的性能

時間復(fù)雜度:平均:O(n2) ?最好:O(n2) 最差:O(n2)

? ? ? ? 穩(wěn)定:穩(wěn)定的

空間復(fù)雜度:O(1)

備注:在n較小時排序效果比較好,優(yōu)點是比較簡單。但是隨著n的增大,耗時增加很快。

3、實際測試結(jié)果

使用Xcode對冒泡排序進行了測試,結(jié)果如下

nn倍數(shù)第1次第2次第3次平均時間倍數(shù)使用時間(單位)
10?18.0025.0314.0119.01?微秒
1001067.9770.9943.9960.983.21微秒
1000102.071.942.082.0333.29毫秒
10 00010298.59265.01279.29280.96138.40毫秒
100 0001029.8931.1832.5131.19111.01
200 0002129.95122.60128.04126.984.07

?

基本上可以發(fā)現(xiàn),隨著數(shù)據(jù)規(guī)模增加到之前的N倍,所用的時間是之前所用時間的N2倍。比如一萬數(shù)據(jù)用時是280.96毫秒,十萬數(shù)據(jù)用時是31.19秒,十萬數(shù)據(jù)用時是一萬數(shù)據(jù)用時的111.01倍(大約是102倍)。和冒泡排序法的時間復(fù)雜度O(N2)是相符的。

測試程序如下:

在Xcode下運行。

#import <Foundation/Foundation.h> #define SORT_NUM 200000 //需要排序的數(shù)組的長度 int main(int argc, const char * argv[]) { #pragma mark --startint a[SORT_NUM];printf("未排序:");for (int i=0; i<SORT_NUM; i++){//隨機生成數(shù)組a[i]=arc4random()%SORT_NUM+1;// printf(" %d",a[i]);}NSDate * startTime=[NSDate date];startTime=[startTime dateByAddingTimeInterval:60*60*8];for (int i=0; i<SORT_NUM; i++)//外層循環(huán){for (int j=0; j<SORT_NUM-i-1; j++)//內(nèi)層循環(huán){if (a[j]>a[j+1])//交換數(shù)據(jù){int temp=a[j];a[j]=a[j+1];a[j+1]=temp;}}}NSDate * endTime=[NSDate date];endTime=[endTime dateByAddingTimeInterval:60*60*8];NSTimeInterval sortTime=[endTime timeIntervalSinceDate:startTime];printf("\n排序后:\n");//for (int i=0; i<SORT_NUM; i++)// printf(" %d",a[i]);NSLog(@"開始時間:%@",startTime);NSLog(@"結(jié)束時間:%@",endTime);NSLog(@"使用時間:%.2f微秒",sortTime*1000000);NSLog(@"使用時間:%.2f毫秒",sortTime*1000);NSLog(@"使用時間:%.2f秒",sortTime);printf("\n冒泡排序\n");#pragma mark --endreturn 0; } 

轉(zhuǎn)載于:https://www.cnblogs.com/nathan1987/p/4839497.html

總結(jié)

以上是生活随笔為你收集整理的基本算法研究1-冒泡排序算法测试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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