【发布时间】:2018-01-21 12:22:29
【问题描述】:
所以,实际上我需要的是在排序后保留旧数组的索引。例如,如果我输入[2,4,1,5,7,9,6],则输出为[2,0,1,3,6,4,5]。我已经使用了qsort,如果没有重复元素,它会很好地工作。
如果有重复的元素,有时第一个重复的元素放在最后。比如输入是[5,4,6,5,2,1,3],我想输出的是[5,4,6,1,0,3,2]。所以,5 具有索引 0 放在具有索引 3 的 5 之前。但是,使用qsort 有时会输出[5,4,6,1,3,0,2]。
你能帮我解决这个问题吗?或者我应该创建自己的排序功能?你能帮我创建它吗?
这是我的代码:
#include <stdlib.h>
int* sortidx(double *X,int n)
{
int *idx,i,j;
int cmp(const void *a,const void *b)
{
return X[*(int*)a]>=X[*(int*)b]?1:-1;
}
idx=(int*)calloc(n,sizeof(int));
for(i=0;i<n;i++)
{
idx[i]=i;
}
qsort(idx,n,sizeof(int),cmp);
return idx;
}
【问题讨论】:
-
您似乎需要所谓的“稳定”排序算法。在这里查看en.wikipedia.org/wiki/Sorting_algorithm#Stability的含义。然后从那些描述为“稳定”的算法中选择一种算法,你就应该设置好了。
-
您正在寻找的称为稳定排序。谷歌搜索“stable qsort c”会带来一些点击;我建议你看看这些。
-
顺便说一句,您使用的是 GCC 扩展的嵌套函数。
标签: c arrays sorting qsort stable-sort