実際には、ソート後に古い配列のインデックスを保持する必要があります。たとえば、入力した場合、[2,4,1,5,7,9,6]
、出力は[2,0,1,3,6,4,5]
です。私はすでにqsort
を使用しており、重複する要素がなければうまく動作します。どのように配列を並べ替えるが、重複要素の位置をCに保持するか?
重複する要素がある場合は、最初に重複する要素が最後に配置されることがあります。たとえば、入力が[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;
}
あなたは「安定」ソートアルゴリズムと呼ばれるものを必要としているようです。ここをクリックhttps://en.wikipedia.org/wiki/Sorting_algorithm#Stability意味。次に、「安定」と記載されているアルゴリズムの中からアルゴリズムを選択すると、セットアップする必要があります。 – Yunnosch
あなたが探しているものは* stable sort *と呼ばれています。グーグル "stable qsort c"は数回ヒットします。私はそれらを見てみることをお勧めします。 – NPE
btw GCCの拡張機能であるネストされた関数を使用していることに注意してください。 –