订购浮点数从文件读取快速选择给出分段错误

时间:2016-09-28 15:47:10

标签: c quickselect

我必须使用快速选择来排序和编写数组的前N个元素并将它们写在文本上。

问题在于输入文件和我尝试从中读取的数据量。

我使用常量N来定义我想从文件中读取的最大数量,但到目前为止它只能从文件中读取和排序多达194个元素。然而,我应该能够以1000万这样做。

以下是代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <limits.h>
#define N 194

float qselect(float *array,int ini, int fin, int k){
    int i;
    int st = ini;
    float tmp;

    //finding a pivot
    for (i = 0; i < fin - 1; i++) {
      if (array[i] < array[fin-1]) {

        tmp = array[st];
        array[st] = array[i];
        array[i] = tmp;
        st++;
      }
    }
    //exchanging the pivot with the last element of the array
    tmp = array[fin-1];
    array[fin-1] = array[st];
    array[st] = tmp;

    //veryfing the pivot
    if (k == st)
        return array[st];
    else if (st>k)
        return qselect(array,ini,st,k);//search on the left
    else
        return qselect(array,ini+st,fin,k);//search on the right 
}
int main(void)
{
    FILE *input;
    FILE *output;
    int range;
    //opening the files
    input = fopen("numeros.txt","r");
    output = fopen("out.txt","w");
    printf("Select your N : ");
    scanf("%d",&range);

    float *array_x;
    array_x = malloc(sizeof(float)*N);
    float num;
    int size=0;

    for(int f=0;f<N; f++){
        fscanf(input,"%f",&array_x[size]);

        size++;
    }

    int i;
    for (i = 0; i < range; i++) {
            fprintf(output,"%f ",  qselect(array_x,0, size, i));
    }
    fclose(input);
    fclose(output);
    free(array_x);

    return 0;        
}

如果我尝试定义N = 195或更多,则代码不起作用。

0 个答案:

没有答案