我们被要求创建一个返回整数指针的函数并获取参数
int *func(int *list,int size)
我想创建一个整数数组,其条目描述了当数组被排序时原始数组中的条目所具有的位置,但是如果没有对原始数组进行排序,这应该在函数内部完成 然后将一个指向entries数组的指针返回给main函数。 例如:
主阵列
3,17,9,2,11,26,5
返回的数组是:
1,5,3,0,4,6,2
我正在考虑将主数组复制到另一个数组后对其进行排序!所以主要的顺序不会丢失,然后将它们一起比较以填充所需的索引数组,我认为这有点长的任何其他想法?
答案 0 :(得分:1)
您的任务涉及同时对两个数组(值和位置)进行排序。要做到这一点,你可以:
qsort
; qsort_r
,允许您通过void *
ointer或第一种方法是最常用和最便携的方法。标准排序函数qsort
可以在数组上工作,其中数组元素可以具有任何大小。所以:创建一个(值,位置)对的辅助数组,按位置排序,填充结果数组,你必须在堆上分配:
struct pair {
int val;
int pos;
};
int paircmp(const void *pa, const void *pb)
{
const struct pair *a = pa;
const struct pair *b = pb;
return (a->val > b->val) - (a->val < b->val);
}
int *func(int array[], int n)
{
struct pair pair[n];
int *result;
int i;
for (i = 0; i < n; i++) {
pair[i].val = array[i];
pair[i].pos = i;
}
qsort(pair, n, sizeof(*pair), paircmp);
result = malloc(n * sizeof(*result));
for (i = 0; i < n; i++) {
result[pair[i].pos] = i;
}
return result;
}
此处,paircmp
是qsort
的比较回调函数。
[qsort_r][qsort_r]
方法很干净,但qsort_r
函数是一个不可移植的GNU扩展。它仍然需要一个辅助阵列。 (如果你的数组是一个排序索引数组,那么甚至不需要它。)
步骤与以前相同:创建索引的辅助数组,对其进行排序,以便对这些索引处的数组条目进行排序,然后创建结果数组:
int indexcmp(const void *pa, const void *pb, void *data)
{
const int *a = pa;
const int *b = pb;
const int *array = data;
return (array[*a] > array[*b]) - (array[*a] < array[*b]);
}
int *func2(int array[], int n)
{
int *result = malloc(n * sizeof(*result));
int pos[n];
int i;
for (i = 0; i < n; i++) pos[i] = i;
qsort_r(pos, n, sizeof(*pos), indexcmp, array);
for (i = 0; i < n; i++) result[pos[i]] = i;
return result;
}
比较函数indexcmp
需要另外一个参数。
第三个选项,滚动你自己的排序功能,是最有趣的,但我会把它留给你。
答案 1 :(得分:0)
这应该这样做,但我不能帮助感觉有一种更简单的方法。
#include<stdio.h>
#include<stdlib.h>
typedef struct {
int value;
int index;
int index2;
} sorter;
int cmp(const void *a, const void *b) {
return ((sorter*)a)->value - ((sorter*)b)->value;
}
int cmp2(const void *a, const void *b) {
return ((sorter*)a)->index - ((sorter*)b)->index;
}
int *func(int *list, int size) {
int i, *iarray;
sorter *sarray = malloc(size * sizeof(sorter));
if (sarray == NULL)
return NULL;
for (i=0; i<size; i++) {
sarray[i].index = i; // original position
sarray[i].value = list[i]; // element value
}
qsort (sarray, size, sizeof(sorter), cmp); // sort by value
for (i=0; i<size; i++)
sarray[i].index2 = i; // sorted position
qsort (sarray, size, sizeof(sorter), cmp2); // sort by original position
iarray = malloc(size * sizeof(int));
if (iarray == NULL) {
free (sarray);
return NULL;
}
for (i=0; i<size; i++)
iarray[i] = sarray[i].index2; // position when sorted
free (sarray);
return iarray;
}
int main(void)
{
int i, size, *sorted, list[] = {3,17,9,2,11,26,5};
size = sizeof(list)/sizeof(int);
sorted = func(list, size);
if (sorted == NULL)
printf("Error in func\n");
else {
for (i=0; i<size; i++)
printf("%d, ", sorted[i]);
printf("\n");
free(sorted);
}
return 0;
}
节目输出:
1, 5, 3, 0, 4, 6, 2,