如何解决根据另一个指针对指针进行排序
我不知道我问得对不对,但我的意思是:
我在普通 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,3,4,...)
排序后
tira = (7,...) ani = (2,1,...)
我找到了一些带有数组的解决方案,但我不允许使用它们(必须是指针),而且我无法将这些解决方案转换为指针。
有人能指点我正确的方向吗? (抱歉开个坏玩笑XD)
解决方法
您需要编写自己的排序函数来完成这项工作。 qsort()
仅限于对内存中连续的对象进行排序,并且由于您的每个逻辑对象都拆分为 ani
的一个元素和 tira
的一个元素,因此它们是不连续的。>
我只是编写一个插入排序或者一个选择排序,将两个数组作为输入。它根据 tira
的内容执行元素比较,但无论何时执行复制或交换,它都适用于 tira
的元素和 ani
的相应元素。同样的方法也适用于大多数其他排序例程,但插入和选择排序特别容易编写。
通常不能对两个不同的数组进行排序。
但是,如果您创建一个辅助结构来记住 tira
和 ani
的相应元素的相关信息,则是可能的。
但是,它可能有点麻烦并且会占用一些额外的内存。还有其他方法来定义结构体(例如索引值、指针等)
无论如何,这里有一些代码可以做到这一点:
#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,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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。