如何对整数指针数组进行排序?
How to qsort array of integer pointers?
我有以下函数需要return指向排序列表的指针数组
int **list_elements_sorted(int *array, int n)
{
if (n <= 0)
{
return NULL;
}
int **sorted_list = malloc(n * sizeof(int *));
assert((sorted_list != NULL) && "Error! Memory allocation failed!");
for (int i = 0; i < n; i++)
{
sorted_list[i] = &array[i];
}
qsort(sorted_list, n, sizeof(int *), comp_list_asc);
return sorted_list;
}
和比较函数
int comp_list_asc(const void *a, const void *b)
{
int *A = *(int **)a;
int *B = *(int **)b;
return (A - B);
}
当我输入数组 E.G: 3 2 5
我得到相同的输出 3 2 5
,我做错了什么?
void test_sorted_list_valid_3(void **state)
{
int **output;
int n = 3;
int int_list[] = {3, 2, 5};
int *int_list_sorted[] = {&int_list[1],
&int_list[0],
&int_list[2]};
output = list_elements_sorted(int_list, n);
assert_memory_equal(int_list_sorted, output, n);
free(output);
}
您减去的是指针,而不是整数。以下更改应该适合您。
int comp_list_asc(const void *a, const void *b)
{
int *A = *(int **)a;
int *B = *(int **)b;
return (*A - *B); // here's the change
}
正如@tsanisl 指出的那样,减去整数很容易出现 overflow/underflow 错误。这些可以通过更改 return 语句来解决,如下所示。
return *A == *B ? 0 : *A < *B ? -1 : 1;
您需要在 comp_list_asc
中减去 A
和 B
之前取消引用。
你也排序错了,int_list
(不是int*
的数组),而不是int_list_sorted
.
#include <stdio.h>
#include <stdlib.h>
int comp_list_asc(const void *a, const void *b) {
int *A = *(int **)a;
int *B = *(int **)b;
return *A - *B; // dereference
}
int main() {
int int_list[] = {3, 2, 5};
int *int_list_sorted[] = {&int_list[0],
&int_list[1],
&int_list[2]};
int n = sizeof int_list_sorted / sizeof *int_list_sorted;
// Sort the correct thing:
qsort(int_list_sorted, n, sizeof(int *), comp_list_asc);
// Print result to compare input and output:
for(int i = 0; i < n; ++i) {
printf("%d %d\n", int_list[i], *int_list_sorted[i]);
}
}
我有以下函数需要return指向排序列表的指针数组
int **list_elements_sorted(int *array, int n)
{
if (n <= 0)
{
return NULL;
}
int **sorted_list = malloc(n * sizeof(int *));
assert((sorted_list != NULL) && "Error! Memory allocation failed!");
for (int i = 0; i < n; i++)
{
sorted_list[i] = &array[i];
}
qsort(sorted_list, n, sizeof(int *), comp_list_asc);
return sorted_list;
}
和比较函数
int comp_list_asc(const void *a, const void *b)
{
int *A = *(int **)a;
int *B = *(int **)b;
return (A - B);
}
当我输入数组 E.G: 3 2 5
我得到相同的输出 3 2 5
,我做错了什么?
void test_sorted_list_valid_3(void **state)
{
int **output;
int n = 3;
int int_list[] = {3, 2, 5};
int *int_list_sorted[] = {&int_list[1],
&int_list[0],
&int_list[2]};
output = list_elements_sorted(int_list, n);
assert_memory_equal(int_list_sorted, output, n);
free(output);
}
您减去的是指针,而不是整数。以下更改应该适合您。
int comp_list_asc(const void *a, const void *b)
{
int *A = *(int **)a;
int *B = *(int **)b;
return (*A - *B); // here's the change
}
正如@tsanisl 指出的那样,减去整数很容易出现 overflow/underflow 错误。这些可以通过更改 return 语句来解决,如下所示。
return *A == *B ? 0 : *A < *B ? -1 : 1;
您需要在 comp_list_asc
中减去 A
和 B
之前取消引用。
你也排序错了,int_list
(不是int*
的数组),而不是int_list_sorted
.
#include <stdio.h>
#include <stdlib.h>
int comp_list_asc(const void *a, const void *b) {
int *A = *(int **)a;
int *B = *(int **)b;
return *A - *B; // dereference
}
int main() {
int int_list[] = {3, 2, 5};
int *int_list_sorted[] = {&int_list[0],
&int_list[1],
&int_list[2]};
int n = sizeof int_list_sorted / sizeof *int_list_sorted;
// Sort the correct thing:
qsort(int_list_sorted, n, sizeof(int *), comp_list_asc);
// Print result to compare input and output:
for(int i = 0; i < n; ++i) {
printf("%d %d\n", int_list[i], *int_list_sorted[i]);
}
}