Li_Chi 2023-03-20 23:10 采纳率: 100%
浏览 162
已结题

关于#C语言冒泡排序型#的问题,如何解决?

#C语言冒泡排序时间求救!
为什么最差的逆序在冒泡排序中的运行时间比随机数冒泡排序的运行时间还短?!

#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);
    }

img

  • 写回答

9条回答 默认 最新

  • ksgpjhqf 2023-03-21 01:31
    关注

    冒泡排序逆序速度快于乱序的原因是CPU的流水线和分支预测技术。参考这篇文章:冒泡排序乱序速度慢于逆序探究
    我自己也测试了一下,与编译器优化有关,在release选项下,无论是先乱序还是先逆序,无论数组开多大,无论数组有没有重复值,平均下来逆序总是比乱序时间短。而在debug选项下,逆序比乱序时间长。下面是我测试的代码,在你的代码的基础上做了一些改动。

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define MAXN 100000
    #define swap(a,b) (a^=b,b^=a,a^=b)
    
    void bubble(int a[], int n) {
        int i, j;
        int flag = 0;
        for (i = n - 1; i > 0; i--) {
            flag = 0;
            for (j = 0; j < i; j++) {
                if (a[j] > a[j + 1]) {
                    swap(a[j], a[j + 1]);
                    flag = 1;
                }
            }
            if (flag == 0)break;
        }
    }
    
    double bubbletime(int a[], int n) {
        static int starttime, endtime;
        starttime = clock();
        bubble(a, n);
        endtime = clock();
        return (double)(endtime - starttime) / CLOCKS_PER_SEC;
    }
    
    int main() {
        int a[MAXN], b[MAXN];
        int i, j;
        srand(time(NULL));    //给随机数种子
        for (i = 0; i < MAXN; i++) {
            a[i] = i;
        }
        //随机打乱
        for (i = 0; i < MAXN; i++) {
            j = i + rand() % (MAXN - i);
            swap(a[i], a[j]);
            b[i] = a[i];
        }
        printf("\nRandom Bubble Running Time:为 %.3f 秒。\n", bubbletime(a, MAXN));
        for (i = 0; i < MAXN; i++)a[i] = MAXN - i - 1;
        printf("\nWorst Bubble Running Time:为 %.3f 秒。\n", bubbletime(a, MAXN));
        printf("\nRandom Bubble Running Time:为 %.3f 秒。\n", bubbletime(b, MAXN));
        return 0;
    }
    

    release选项的执行结果

    img


    debug选项的执行结果

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(8条)

报告相同问题?

问题事件

  • 系统已结题 3月30日
  • 已采纳回答 3月22日
  • 赞助了问题酬金15元 3月20日
  • 创建了问题 3月20日

悬赏问题

  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。