这周学校发布了一个作业是比较3个排序的平均时间和最坏时间 但是我却发现冒泡排序中逆序居然排序时间比随机序还要短,接下来给大家看一下实验报告,分析结果在最后
实验1 排序算法的效率分析
一、【实验目的】
(1)复习排序算法的实现过程;
(2)设计平均与最坏情况下时间复杂度的数据环境并理解相关含义;
(3)初步了解算法时间复杂度的分析方法。
二、【实验内容】
至少选择3种排序算法,要求对每种排序算法设计2组数据,其中一组为最坏情况,一组为一般情况(随机),数据规模不能少于10000。
记录不同情况下算法的实际运行时间,同时分析算法最坏情况与平均情况的运行次数。
三、实验源代码
#include <stdio.h>
#include <time.h>
#define MAXN 30000
void swap1(int *px,int *py){
int temp;
temp=*px;
*px=*py;
*py=temp;
}
void bubble(int a[],int n){
int i;
int j;
int flag=0;
for(i=1;i<n;i++){
for(j=0;j<n-i;j++){
if(a[j]>a[j+1]){
swap1(&a[j],&a[j+1]);
}
}
}
}
void swap2(int a[],int n){
int half;
half=n/2;
int i;
for(i=0;i<half;i++){
swap1(&a[i],&a[n-i-1]);
}
}
int main()
{
int a[MAXN];
int i;
srand((unsigned)time(NULL)); //给随机数种子
for(i=0;i<MAXN;i++){
a[i]=rand();
}
clock_t start_time=clock();
//clock_t 是 一种数据类型,通常用于表示程序运行的时间。 它是由 time.h 库中的 clock() 函数返回的 CPU 时钟周期数的数据类型。
bubble(a,MAXN);
clock_t end_time = clock();
for(i=0;i<20;i++){
printf("%3d ",a[i]);
}
double elapsed_time = (double) (end_time - start_time) / CLOCKS_PER_SEC;
printf("\nRandom Bubble Running Time:为 %.3f 秒。\n", elapsed_time);
swap2(a,MAXN);
for(i=0;i<20;i++){
printf("%3d ",a[i]);
}
start_time = clock();
bubble(a,MAXN);
end_time = clock();
elapsed_time = (double) (end_time - start_time) / CLOCKS_PER_SEC;
printf("\nWorst Bubble Running Time:为 %.3f 秒。\n", elapsed_time);
return 0;
}
四、实验结果
五、实验分析与总结
在实际运行中发现逆序在冒泡排序中的运行时间比随机数冒泡排序的运行时间还短,可能的原因是:
逆序冒泡指针交换的,交互的是指针地址,倒序的话,每次都是相邻指针进行交互,速度更加快
“CPU的流水线和分支预测技术”。这其实就是说,cpu是有“记忆”的。这种“记忆”如何影响if语句耗时,可以这样理解:厨师切大量土豆时,如果每次切的土豆片一样厚,厨师就会形成记忆,切土豆变得熟练,切土豆的速度就会变快;如果一会儿要求切得厚,一会儿要求切得薄,这样频繁随机交替,厨师就不能形成记忆,切土豆的速度就会慢得多。cpu有“记忆”,就可以像厨师一样,对某些固定的操作变得“熟练”:如果每次执行if都跳转到同一个分支,cpu的跳转就会变得“熟练”,跳转耗时就会降低。