我正在尝试实现此合并排序功能,以对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回答,因为它是正确的,但我不能。 再次感谢您的宝贵时间!
答案 0 :(得分:0)
这是使用类似于 <button [disabled]="form.invalid">
<span [matTooltip]="form.invalid ? 'some text' : ''">button text</span>
</button>
的参数对数组进行自顶向下合并的一种简单实现。时间复杂度为O(n log n)。它使用大小与输入数组相似的临时存储。
qsort