根据包含索引的另一个数组的内容对C字符数组进行排序

根据包含索引的另一个数组的内容对C字符数组进行排序,c,C,我目前有2个阵列: char A = {"Hello", "Hello2", "Hello3", "Hello4"} int B = {3, 2, 0, 1}; B数组中的每个索引位置对应于消息数组中的相同索引位置。例如 “Hello”需要在第3位,“Hello2”需要在第2位,“Hello3”需要在第0位,“Hello4”需要在第1位 期望输出: char aSorted = {"Hello3", "Hello4", "Hello2", "Hello"}; 因此,我需要一种排序算法,可以根

我目前有2个阵列:

char A = {"Hello", "Hello2", "Hello3", "Hello4"}
int B = {3, 2, 0, 1};
B
数组中的每个索引位置对应于消息数组中的相同索引位置。例如
“Hello”
需要在第3位,
“Hello2”
需要在第2位,
“Hello3”
需要在第0位,
“Hello4”
需要在第1位

期望输出:

char aSorted = {"Hello3", "Hello4", "Hello2", "Hello"};
因此,我需要一种排序算法,可以根据
B
a
进行排序。我真的很难理解这一点,我想知道是否有人能给我一个在C中实现这一点的解决方案。请记住,我的a和B数组可能每个都有256000个值,所以它应该是最优的。谢谢。

从这里:

#include<stdio.h>

main(argc,argv)
const char** argv;
{
        char chararray[4]={'H','I','J','K'};
        int indexarray[4]={3,2,0,1};
        char newchararray[4];
        for(int i=0;i<4;i++) {
                newchararray[i]=chararray[indexarray[i]];
        }
        for(int i=0;i<4;i++) {
                printf("%c ",newchararray[i]);
        }
        printf("\n\n");
        return 0;
}
使用两个数组创建结构:

struct myText {
    char A;
    int B;

};
typedef struct myText MyText;
创建比较器:

int compareMyText(const void *v1, const void *v2)
{
    const MyText *u1 = v1;
    const MyText *u2 = v2;
    return u1->B < u2->B;
}
完整工作代码:

#include <stdlib.h>
#include <stdio.h>
struct myText
{
    char *A;
    int B;
};
typedef struct myText MyText;


int compareMyText (const void *v1, const void *v2) {
     const MyText *u1 = v1;
     const MyText *u2 = v2;
     return u1->B < u2->B;
}

int main () {
    MyText array[4];
    array[0].A = "Hello";
    array[0].B = 3;
    array[1].A = "Hello2";
    array[1].B = 2;
    array[2].A = "Hello3";
    array[2].B = 0;
    array[3].A = "Hello4";
    array[3].B = 1;

    qsort (array, 4, sizeof (MyText), compareMyText);

    for (int i = 0; i < 4; i++){
            printf ("%s - %d\n", array[i].A, array[i].B);
    }
    return 0;
}
#包括
#包括
结构myText
{
char*A;
int B;
};
typedef struct myText myText;
int compareMyText(常量无效*v1,常量无效*v2){
常量MyText*u1=v1;
常量MyText*u2=v2;
返回u1->BB;
}
int main(){
MyText数组[4];
数组[0]。A=“你好”;
数组[0]。B=3;
数组[1]。A=“Hello2”;
数组[1],B=2;
数组[2]。A=“Hello3”;
数组[2]。B=0;
数组[3]。A=“Hello4”;
数组[3].B=1;
qsort(数组,4,sizeof(MyText),compareMyText);
对于(int i=0;i<4;i++){
printf(“%s-%d\n”,数组[i].A,数组[i].B);
}
返回0;
}
这里有一个解决方案

#include <stdio.h>

int main()
{
  char *A[] = {"Hello", "Hello2", "Hello3", "Hello4"};//declare A as char pointer
  int B[] = {3, 2, 0, 1};
  #define SIZE (sizeof B / sizeof (int)) //make code extensible;
                          //sizeof(int array)->"B" divided by sizeof(int)
  char *C[SIZE];           

  for(int i = 0; i < SIZE;i++){
    C[i] = A[B[i]]; //array C stores the sorted result
}

/* To print the result

  for(int i = 0; i < SIZE;i++){
    printf("%s ",C[i]);
  }
  putchar('\n');   
*/

  return 0;
}
#包括
int main()
{
char*A[]={“Hello”、“Hello2”、“Hello3”、“Hello4”};//将A声明为char指针
intb[]={3,2,0,1};
#定义大小(sizeof B/sizeof(int))//使代码可扩展;
//sizeof(int数组)->“B”除以sizeof(int)
字符*C[大小];
对于(int i=0;i
您尝试了什么?这不是真正的排序问题,而是根据您拥有的数据填充一个新数组。它应该很简单。分配一个新数组
F
,用整数
i
遍历
B
aSorted[B[i]=a[i]
。该注释应该是一个答案。显示的代码不会编译
char A
不定义数组,也不定义
int B
char aSorted
。由4个C字符串组成的数组是
char*array[4]
,您可以使用
“%s”
格式打印字符串。但肖恩不是这样做的。那是错别字吗?是的,那可能是原问题中的错别字。(这个问题没有表现出太多的努力。)我把你的上一个问题误解为或多或少的字面意思,但它是在OP中提出的。对此感到抱歉。是的,非常正确:)也许,这个问题不同,他对它的解释也不同。如果一个人太累了,就会发生这种情况。如果我们仔细观察字符串,问题可能会根据它们包含的数字进行调整,例如第二个位置的
hello2
,等等。不管怎样,谢谢:)你为什么觉得表演很糟糕?数据是任意的,您必须填充新数组的每个插槽,因此您不能比O(n)更好。如果您知道您只需要交换很少的ITAM,您就可以做得更好,但我们没有这方面的信息。也许你把这和许多排序算法的复杂性混淆了,也就是O(nlog(n))。O(log(n))是二进制搜索的复杂性,但不必访问每一项。ISO C禁止嵌套函数。@EdHeal:因为
qsort()
需要这样做。或者我遗漏了要点吗?您可以直接强制转换参数,从而避免除了在cast@EdHeal:必须使用
int(*)(const void*,const void*)
作为比较函数的类型。否则我看不到任何空指针。这个
#定义大小sizeof(B)/sizeof(B[0])
最好是
#定义大小(a)(sizeof(a)/sizeof*(a))
。然后像
大小(B)
一样使用它。
#include <stdlib.h>
#include <stdio.h>
struct myText
{
    char *A;
    int B;
};
typedef struct myText MyText;


int compareMyText (const void *v1, const void *v2) {
     const MyText *u1 = v1;
     const MyText *u2 = v2;
     return u1->B < u2->B;
}

int main () {
    MyText array[4];
    array[0].A = "Hello";
    array[0].B = 3;
    array[1].A = "Hello2";
    array[1].B = 2;
    array[2].A = "Hello3";
    array[2].B = 0;
    array[3].A = "Hello4";
    array[3].B = 1;

    qsort (array, 4, sizeof (MyText), compareMyText);

    for (int i = 0; i < 4; i++){
            printf ("%s - %d\n", array[i].A, array[i].B);
    }
    return 0;
}
#include <stdio.h>

int main()
{
  char *A[] = {"Hello", "Hello2", "Hello3", "Hello4"};//declare A as char pointer
  int B[] = {3, 2, 0, 1};
  #define SIZE (sizeof B / sizeof (int)) //make code extensible;
                          //sizeof(int array)->"B" divided by sizeof(int)
  char *C[SIZE];           

  for(int i = 0; i < SIZE;i++){
    C[i] = A[B[i]]; //array C stores the sorted result
}

/* To print the result

  for(int i = 0; i < SIZE;i++){
    printf("%s ",C[i]);
  }
  putchar('\n');   
*/

  return 0;
}