【问题标题】:Sorting a C char array based on contents of another array containing the indexes根据包含索引的另一个数组的内容对 C char 数组进行排序
【发布时间】:2019-10-28 00:43:20
【问题描述】:

我目前有 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"};

因此,我需要一个可以根据BA 进行排序的排序算法。我真的很难解决这个问题,想知道是否有人可以给我一个在 C 中执行此操作的解决方案。请记住,我的 A 和 B 数组可能每个都有 256000 个值,所以它应该是最佳的。谢谢。

【问题讨论】:

  • 你尝试了什么?
  • 这不是真正的排序问题,而是根据您拥有的数据填充一个新数组。它应该是直截了当的。
  • 分配一个新数组F,使用整数iaSorted[B[i]] = A[i]遍历B
  • 那条评论应该是一个答案。
  • 显示的代码无法编译。 char A 没有定义数组,int Bchar aSorted 也没有。

标签: c


【解决方案1】:
#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;
}

但还有一件事,你如何将这样的字符串放入 char 数组中? 我的编译器 cc 更具体地说,给出了

error: excess elements in char array initializer
  char chararray[4]={"H","I","J","K"};
                         ^

【讨论】:

  • 一个由 4 个 C 字符串组成的数组是 char *array[4],而您以 "%s" 格式打印字符串。
  • 但这不是肖恩所做的。是不是打错字了?
  • 是的,这可能是原始问题中的错字。 (这个问题并没有表现出太多的努力。)而且我或多或少地误解了你的最后一个问题,但它在 OP 中得到了解决。对此感到抱歉。
  • 是的,非常正确:) 也许,问题不同,他的解释也不同。如果一个人筋疲力尽,就会发生这种情况。如果我们仔细查看字符串,问题可能会根据它们包含的数字调整它们,例如第二个位置的hello2 等等。无论如何,谢谢:)
  • 为什么你觉得表演很糟糕?数据是任意的,你必须填写新数组的每个槽,所以你不能比 O(n) 更好。如果您知道只需要交换很少的 itam,那么您只会变得更好,但我们没有这些信息。也许您将这与许多排序算法的复杂性混淆,即 O(n log(n))。 O(log(n)) 是二分查找的复杂度,但不一定要访问每一项。
【解决方案2】:

来自question

创建一个包含两个数组的结构:

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;
}

调用 qsort:

qsort(array, 25, sizeof(myText), compareMyText);

完整的工作代码:

#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;
}

【讨论】:

  • ISO C 禁止嵌套函数。
  • @EdHeal:因为qsort() 期待这一点。还是我没有抓住重点?
  • 您可以只强制转换参数 - 从而避免除了强制转换之外的 void 指针
  • @EdHeal:必须使用int(*)(const void*, const void*) 作为比较函数的类型。否则我看不到任何空指针。
【解决方案3】:

这里有一个解决方案.....

#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;
}

【讨论】:

  • 这个#define SIZE sizeof(B)/sizeof(B[0]) 最好是#define SIZE(a) (sizeof (a) / sizeof *(a))。然后像SIZE(B)一样使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-19
  • 1970-01-01
  • 1970-01-01
  • 2022-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多