根据另一个指针对指针进行排序

Sorting a pointer based on another pointer

我不知道我问的对不对,但我的意思是:

我在纯 C 中有这段代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int cmpfunc (const void * a, const void * b) {
   return (*(int*)b - *(int*)a);
}

int main (int argc, char const *avrg[]) {
   int i;
   int *ani, *tira;

   srand(time(NULL));
   tira = malloc(10*sizeof(int));
   ani = malloc(10*sizeof(int));

   for (i=0; i<10; i++) {
      *(tira+i) = (rand()%10);
      *(ani+i) = i + 1;
   }

   qsort(tira, 10, sizeof(int), cmpfunc);
   
   free(tira);
   free(ani);

   return 0;
}

如您所见,我正在使用 qsort() 从大到小对“tira”进行排序,而“ani”没有排序。

我想做的是使用“tira”的值对“ani”进行排序,例如:

tira = (2,7,6,2,...) ani = (1,2,3,4,...)

排序后

tira = (7,6,2,2,...) ani = (2,3,1,4,...)

我找到了一些数组的解决方案,但不允许我使用它们(必须是指针),我无法将这些解决方案转换为指针。

谁能给我 'wink wink' 指出正确的方向? (不好意思开个玩笑 XD)

您需要编写自己的排序函数来完成这项工作。 qsort() 仅限于对内存中连续的对象进行排序,并且由于每个逻辑对象都分为 ani 的一个元素和 tira 的一个元素,因此它们是不连续的。

我只想写一个插入排序或者一个选择排序,将两个数组作为输入。它根据 tira 的内容执行元素比较,但无论何时执行复制或交换,它都适用于 tira 的元素和 ani 的相应元素。同样的方法也可以应用于大多数其他排序例程,但插入和选择排序特别容易编写。

您通常不能对两个不同的数组进行排序。

但是,如果您创建一个辅助结构来记住 tiraani 的相应元素,这是可能的。

但是,它可能有点麻烦并且会占用一些额外的内存。还有其他定义结构的方法(例如索引值、指针等)

无论如何,这里有一些代码可以做到这一点:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ARRMAX      10

struct idx {
    int tira;                           // tira value
    int ani;                            // ani value
};

void
print(const int *arr,const char *reason)
{
    int i;

    printf("%s:\n",reason);
    for (i = 0;  i < ARRMAX;  ++i)
        printf(" %d",arr[i]);
    printf("\n");
}

int
cmpfunc(const void *vpa, const void *vpb)
{
    const struct idx *ap = vpa;
    const struct idx *bp = vpb;

    return (bp->tira - ap->tira);
}

void
dotest(int randflg,int *tira,int *ani)
{
    int i;
    struct idx *idx;

    printf("\n");

    for (i = 0; i < ARRMAX; i++) {
        tira[i] = 0;
        ani[i] = 0;
    }

    do {
        if (! randflg) {
            tira[0] = 2;
            tira[1] = 7;
            tira[2] = 6;
            tira[3] = 2;

            ani[0] = 1;
            ani[1] = 2;
            ani[2] = 3;
            ani[3] = 4;
            break;
        }

        for (i = 0; i < ARRMAX; i++) {
            tira[i] = (rand() % 10);
            ani[i] = i + 1;
        }
    } while (0);

    print(tira,"tira unsorted");
    print(ani,"ani unsorted");

    struct idx *idxlist = malloc(ARRMAX * sizeof(struct idx));

    for (i = 0;  i < ARRMAX;  ++i) {
        idx = &idxlist[i];

        // get tira value
        idx->tira = tira[i];

        // get ani value
        idx->ani = ani[i];
    }

    qsort(idxlist, ARRMAX, sizeof(struct idx), cmpfunc);

    for (i = 0;  i < ARRMAX;  ++i) {
        idx = &idxlist[i];
        tira[i] = idx->tira;
        ani[i] = idx->ani;
    }

    print(tira,"tira sorted");
    print(ani,"ani sorted");

    free(idxlist);
}

int
main(int argc, char const *avrg[])
{
    int i;
    int *ani, *tira;

    srand(time(NULL));

    tira = malloc(ARRMAX * sizeof(int));
    ani = malloc(ARRMAX * sizeof(int));

    dotest(0,tira,ani);
    dotest(1,tira,ani);

    free(tira);
    free(ani);

    return 0;
}

程序输出如下:

 tira unsorted:
 2 7 6 2 0 0 0 0 0 0
ani unsorted:
 1 2 3 4 0 0 0 0 0 0
tira sorted:
 7 6 2 2 0 0 0 0 0 0
ani sorted:
 2 3 1 4 0 0 0 0 0 0

tira unsorted:
 7 1 1 5 4 3 4 8 6 4
ani unsorted:
 1 2 3 4 5 6 7 8 9 10
tira sorted:
 8 7 6 5 4 4 4 3 1 1
ani sorted:
 8 1 9 4 5 7 10 6 2 3