基本算法研究1-冒泡排序算法测试
基本算法研究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é)果如下
| n | n倍數(shù) | 第1次 | 第2次 | 第3次 | 平均 | 時間倍數(shù) | 使用時間(單位) |
| 10 | ? | 18.00 | 25.03 | 14.01 | 19.01 | ? | 微秒 |
| 100 | 10 | 67.97 | 70.99 | 43.99 | 60.98 | 3.21 | 微秒 |
| 1000 | 10 | 2.07 | 1.94 | 2.08 | 2.03 | 33.29 | 毫秒 |
| 10 000 | 10 | 298.59 | 265.01 | 279.29 | 280.96 | 138.40 | 毫秒 |
| 100 000 | 10 | 29.89 | 31.18 | 32.51 | 31.19 | 111.01 | 秒 |
| 200 000 | 2 | 129.95 | 122.60 | 128.04 | 126.98 | 4.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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 发布单机端DELPHI程序访问MySQL
- 下一篇: VIJOS1212 Way Select