关于#C语言冒泡排序型#逆序比随机更快,如何解决?

该实验报告显示,在比较排序算法效率时,冒泡排序在处理逆序数据时的运行时间竟然短于随机序列。这可能是由于CPU的流水线和分支预测技术,使得在处理固定模式的交换(如逆序)时能提高效率。实验包括对冒泡排序在随机和最坏情况下的时间消耗的测量,揭示了排序算法在特定输入下的行为差异。
摘要由CSDN通过智能技术生成

这周学校发布了一个作业是比较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的跳转就会变得熟练,跳转耗时就会降低。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值