如何正确调用此合并排序功能?

时间:2019-09-09 10:21:41

标签: c sorting struct

我正在尝试实现此合并排序功能,以对c中的结构数组进行排序。当我调用函数使程序提前退出时,我认为这是因为我正在排序的数组的类型为row_t *,并且需要为row_t **,我不确定如何正确地分配数据以实现此目的。 / p>

//I have copied relevant bits of my code below

//this is the struct i am trying to sort by the value S
typedef struct 
{ 
    double rho, u, v, x, y, flux_u, flux_v, S;
} row_t;

//This is where i allocate the array i want to sort
row_t* linear_row_arr = (row_t*)malloc(sizeof(row_t)*100);

//this is where i try to call the function,
//linear_row_arr is an array of row_t, with 100 elements
merge_sort((void**)linear_row_arr, 99, row_array_s_comp);

//This is the function i am trying to call.
void merge(void** array, int n, int mid, int cmp(const void*, const void*))
{
    // (0) need extra space for merging
    void** tmp = malloc(n * sizeof(void*));
    void** left = array;
    void** right = array + mid;
    int i = 0;
    int j = 0;
    int left_size = mid;
    int right_size = n - mid;
    // (1) perform the merge
    for (int k = 0; k < n; k++) {
        if (j == right_size)
            tmp[k] = left[i++];
        else if (i == left_size)
            tmp[k] = right[j++];
        else if (cmp(left[i], right[j]) < 1)
            tmp[k] = left[i++];
        else
            tmp[k] = right[j++];
    }
    // (2) copy the merged array
    for (int i = 0; i < n; i++) {
        array[i] = tmp[i];
    }
    // (3) clean up
    free(tmp);
}

void merge_sort(void** array, int n, int cmp(const void*, const void*))
{
    if (n > 1) {
        int mid = n / 2;
        merge_sort(array, mid, cmp);
        merge_sort(array + mid, n - mid, cmp);
        merge(array, n, mid, cmp);
    }
}

int row_array_s_comp(const void* a, const void* b)
{
    row_t* ra = (row_t*)a;
    row_t* rb = (row_t*)b;
    // with int data we can just subtract to get the right behaviour
    return ra->S - rb->S;
}



运行此代码时,代码会提前退出,没有错误消息。

编辑:

我尝试使用@Ian Abbott的解决方案,它在我的比较函数中产生了段错误。可能是我使用malloc而不是calloc来为我的数据分配内存吗?

// This is my function call
//100 elements of row_t*
merge_sort(linear_row_arr, 100, sizeof(row_t*), row_array_s_comp);


编辑2: 谢谢Ian,我已经修复了我的错误,现在可以使用方便的合并排序功能。我对您的答案投了赞成票,但它说它将被公开显示,因为我的代表人数少于15。如果有人需要,这是我使用的最终比较功能


int row_array_s_comp(const void* a, const void* b)
{
    row_t* ra = (row_t*)a;
    row_t* rb = (row_t*)b;
    // with double data we can just subtract to get the right behaviour
    return (ra->S > rb->S) - (ra->S < ra->S);
}


and i called the function with

merge_sort(linear_row_arr, 100, sizeof(row_t), row_array_s_comp);

如果有人发现这个有用的随便,可以@Ians Abotts回答,因为它是正确的,但我不能。 再次感谢您的宝贵时间!

1 个答案:

答案 0 :(得分:0)

这是使用类似于 <button [disabled]="form.invalid"> <span [matTooltip]="form.invalid ? 'some text' : ''">button text</span> </button> 的参数对数组进行自顶向下合并的一种简单实现。时间复杂度为O(n log n)。它使用大小与输入数组相似的临时存储。

qsort