Shell排序随机浮点数组不起作用

时间:2014-01-10 01:07:26

标签: c shell sorting segmentation-fault

我编写了一个shell排序算法,它可以完美地处理整数值,但在尝试对浮点数进行排序时会给出分段错误。你能帮帮我吗?谢谢。

我们在大学做了一个家庭作业,我的老师用插入排序编写了这个程序,它起作用了。我们的作业是将它重写为shell排序(我认为我做得正确),并且可能进一步扩展它以对文件中的字符串和数字进行排序。

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

int int_cmp(const void *p1, const void *p2){
    return *(int*)p1 - *(int*)p2;
}

int float_cmp(const void *p1, const void *p2){
    if (*(float*)p1 == *(float*)p2){
        return 0;
    }
    else if (*(float*)p1 < *(float*)p2){
        return -1;
    }
    else {
        return 1;
    }
}    

void shell_sort(void *v, int nr, int size, int(*p_cmp)(const void*, const void*)){
    int i, j;
    void *pv, *pi, *pj;
    pv = malloc(size); //this is where I get segmentation fault

    for (int gap = nr/2; gap > 0; gap/=2){
        for (i = gap; i < nr; ++i){
            for (j = i-gap; j >= 0; j-=gap){
                pi = v; 
                pi = (char*)pi+j*size; 
                pj = (char*)pi+gap*size; 

                if (p_cmp(pi, pj) > 0){
                    memcpy(pv, pi, size);
                    memcpy(pi, pj, size);
                    memcpy(pj, pv, size);
                }
                else {
                    break;
                }
            }
        }
        free(pv);   
    }

}    

int main(){
    int a[20], n = 20;
    float b[25], m = 25;

    srand(time(NULL));

    printf("Original integer array: ");
    for (int i = 0; i < 20; ++i){
        a[i] = rand() % 100;
        printf("%i ", a[i]);
    }

    printf("Original float array: ");
    for (int j = 0; j < 25; ++j){
        b[j] = (float)rand()/(float)(RAND_MAX)*50;
        printf("%f ", b[j]);
    }

    shell_sort(a, n, sizeof(int), int_cmp);
    shell_sort(b, m, sizeof(float), float_cmp);

    printf("\nInteger array after sort: ");
    for (int i = 0; i < 20; ++i){
        printf("%i ", a[i]);
    }

    printf("\nFloat array after sort: ");
    for (int j = 0; j < 25; ++j){
        printf("%f ", b[j]);
    }

return 0;
}

1 个答案:

答案 0 :(得分:1)

free(pv);移动到外部for循环(循环后)。