qsort()を使用して、bに関して配列aをソートしたいと思います。機能を教えてもらえますか?
a = {0,1,2,3,4} b = {3,4,5,1,2}
答えは{3,4,0,1,2}でなければなりません
関数のコードを教えてください。
お気に入り :
int compare (const void *a,const void *b)
{
return(*(char *)a-*(char *)b);
}
qsort()は1つの配列を受け取り、配列の要素を相互に比較するため、これは現在の方法では不可能です。次のように、両方の値を含む構造体の単一の配列を作成する必要があります。
#include <stdlib.h>
#include <stdio.h>
typedef struct {
int a;
int b;
} c_type;
int
compare(const void *a,
const void *b) {
return ((c_type *)a)->b - ((c_type *)b)->b;
}
int
main(int argc,
char *argv[])
{
int i = 0;
c_type array[] = {{0, 3}, {1, 4}, {2, 5}, {3, 1}, {4, 2}};
qsort(array, sizeof array / sizeof(*array), sizeof(*array), compare);
for ( i = 0; i < sizeof array / sizeof(*array); i++ ) {
printf("%d\t", array[i].a);
}
printf("\n");
return 0;
}
渡されたアドレスに格納されている値と比較するというバニラ実装ではなく、比較関数に何を比較するかを通知するメカニズムが必要になります。static
これは、 (グローバル)ストレージで実現できます。
#include<stdlib.h>
int *Array= NULL;
void SetArray(int *const array)
{
Array= array;
}
int basecompare(const void *a, const void *b)
{
return Array[*((int *) a)]- Array[*((int *) b)];
}
int main(int argc, char *argv[])
{
int a[]= { 0, 1, 2, 3, 4 };
int b[]= { 3, 4, 5, 1, 2 };
size_t len= sizeof(a)/ sizeof(a[0]);
SetArray(b);
qsort(a, len, sizeof(int), basecompare);
return 0;
}