当对一百万个元素的数组进行排序时,如何找到合并排序算法崩溃的原因?

防雾卫士

我是一名法国学生,正在尝试为不同大小的数组计算合并排序算法的执行时间。我也想在.csv文件中写入不同的执行时间。但是,当我的程序尝试对具有100万个元素的数组进行排序时,该过程-1073741571 (0xC00000FD)将以Code :: Blocks返回因此,如果您能为我找到解决方案的方法,我将不胜感激!

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

void genTab(int *tab, int n) {
    int i;
    for (i = 0; i < n; i++) {
        tab[i] = rand() % 100;  
    }
}

void fusion(int *tab, int deb, int mid, int fin) {
    int i = deb;
    int j = mid + 1;
    int k = deb;
    int temp[fin + 1];
    while ((i <= mid) && (j <= fin)) {
        if (tab[i] <= tab[j]) {
            temp[k] = tab[i];
            i++;
        } else {
            temp[k] = tab[j];
            j++;
        }
        k++;
    }
    while (i <= mid) {
        temp[k] = tab[i];
        i++;
        k++;
    }
    while (j <= fin) {
       temp[k] = tab[j];
       k++;
       j++;
    }

    for (i = deb; i <= fin; i++) {
        tab[i] = temp[i];
    }
}

void triFusion(int *tab, int i, int j) {
    if (i < j) {
        triFusion(tab, i, (int)((i + j) / 2));
        triFusion(tab, (int)((i + j) / 2 + 1), j);
        fusion(tab, i, (int)((i + j) / 2), j);
    }
}

void reset(int *tab1, int *tab2, int n) {
    for (int i = 0; i < n; i++) {       
        tab2[i] = tab1[i];
    }
}

int main() {
    srand(time(NULL));
    clock_t start, end;  

    int nbrTest[15] = {
        1000, 5000, 10000, 50000, 80000, 100000, 120000, 140000,
        150000, 180000, 200000, 250000, 300000, 450000, 1000000
    }; 
    FILE *fp;

    char *tpsExecution = "exeTime.csv";

    fp = fopen(tpsExecution, "w");

    fprintf(fp, "Array Size; Merge Time"); 

    for (int i = 0; i < 15; i++) {     
        int n = nbrTest[i];
        printf("Calculating time for an array of %d \n", n);
        int *tab = malloc(sizeof(int) * n);
        genTab(tab, n);      

        int *copie = malloc(sizeof(int) * n);
        reset(tab, copie, n);

        start = clock();
        triFusion(tab, 0, n - 1);
        end = clock();
        float tpsFusion = (float)(end - start) / CLOCKS_PER_SEC;

        reset(tab, copie, n);

        printf("writing in the file\n");
        fprintf(fp, "\n%d;%f", n, tpsFusion);    
        free(tab);
        free(copie);
    }
    fclose(fp);

    return 0;
}

风向标

(注意:在@Eric Postpischil的答案后发布)。

功能

void fusion(int * tab, int deb, int mid, int fin)

有线

int temp[fin+1];

的值fin来自n要排序的元素数量的另一个函数

triFusion(tab, 0, n-1);

作为自动变量,在n较大时中断堆栈

我建议用

int *temp = malloc((fin+1) * sizeof *temp);
if(temp == NULL) {
    puts("malloc");
    exit(1);
}

// ...

free(temp);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

合并排序算法

来自分类Dev

外部合并排序算法如何工作?

来自分类Dev

合并排序算法协助

来自分类Dev

合并排序算法错误

来自分类Dev

合并排序算法失败

来自分类Dev

使用合并排序对结构数组进行排序

来自分类Dev

使用合并排序对数组进行排序

来自分类Dev

C ++合并排序算法,用于可变大小的数组

来自分类Dev

使用具有2个数组作为参数的合并函数进行合并排序

来自分类Dev

合并排序算法未正确合并

来自分类Dev

如何让归并排序算法?

来自分类Dev

使用JS Underscore对相似数组进行key合并排序

来自分类Dev

如何在合并排序中找到最低和最高

来自分类Dev

合并排序算法-计数反转

来自分类Dev

尾递归合并排序算法

来自分类Dev

Python-合并排序递归算法

来自分类Dev

合并排序算法难题

来自分类Dev

使用递归合并排序算法

来自分类Dev

合并排序算法上的递归关系

来自分类Dev

递归调用合并排序算法

来自分类Dev

合并排序算法无法正常运行

来自分类Dev

在JavaScript中实现合并排序算法

来自分类Dev

如何调用合并排序

来自分类Dev

当合并排序优先于快速排序时?

来自分类Dev

合并排序-使用整数数组对字符串数组进行排序

来自分类Dev

我正在尝试使用c ++中的向量来实现(算法简介(CLRS))中的合并排序算法,但数组未排序,

来自分类Dev

如何使用usort对合并数组进行排序?

来自分类Dev

在实现较大数组的合并排序时,bad_alloc异常

来自分类Dev

是否可以使用合并排序(C#)根据多个条件对数组进行排序?