原题:
写一个冒泡排序程序。并用实验证明,它的平均时间复杂度确实是
。
我的解,仅供参考:
在冒泡排序的情况下,我们需要进行N次迭代。在每次迭代中,我们进行比较,并在需要时执行交换。给定大小为N的数组,第一次迭代执行(N-1)比较。第二次迭代执行(N-2)比较。这样,总比较次数为:
用下面的实验来证明:
#include <iostream>
#include <cstdlib>
#include <windows.h>
//因为生成的随机数组没有必要每次都变,所以不使用time()函数
//即不包含<ctime>头文件
using namespace std;
void Random(int *a,int n,int field){
//把随机数种子设置为0
srand(555);
for(int i=0;i<n;i++){
a[i]=rand()%(field+1);
}
}
int main(){
int input=1;
while(input){
int a[50000];
//N是输入的个数
int n;
cin>>n;
Random(a,n,3000);
long start = GetTickCount();//获取开始时间
//冒泡排序
for(int i=0;i<n;i++){
for(int j=0;j<n-i-1;j++){
if(a[j]>a[j+1]){
int temp=a[j+1];
a[j+1]=a[j];
a[j]=temp;
}
}
}
long end = GetTickCount();//获取结束时间
//输出
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
cout<<"\nTime is: "<<end-start<<" s."<<endl;
cin>>input;
}
return 0;
}
int find_max(int arr[n]){
int max = arr[0];
for(int i=1; i<n; i++)
if(arr[i]>max)
max=arr[i];
return max;
}
用excel将结果可视化(单位秒不对,改成毫秒):
即使我们改变种子的值,时间复杂度都成二次函数曲线。
所以冒泡排序的平均时间复杂度是