【问题标题】:Sorting 2 large arrays对 2 个大数组进行排序
【发布时间】:2014-02-11 01:02:19
【问题描述】:

我还没有学习数据结构和算法课程,我在尝试做的事情上遇到了一些麻烦。

我有 2 个大数组,1 个是 char,大约有 80k-100k 个单词,第二个是 int 数组,具有相同数量的整数(例如,写在 words[502] 中的单词的出现次数写在 @ 987654324@)。

我必须对它们进行排序,使其对应单词的最大整数是第一个,第二大的第二个等等,是否可以不使用冒泡排序(对于这些数字来说太慢了)?

void bubble_sort(int n)
{
    int i,j,temp;
    char tempwordy[40]={0};


    for(i=1;i< n;i++)
    {
        for(j=0;j< n-1;j++)
        {
            if(counters[j]>counters[j+1])
            {  
                temp=counters[j];
                counters[j]=counters[j+1];
                counters[j+1]=temp;

            strcpy(tempwordy,words[j]);
            strcpy(words[j],words[j+1]);
            strcpy(words[j+1],tempwordy);
            }
         }
    }
}

【问题讨论】:

  • 标准 C 库具有允许对数组进行排序的 qsort 函数。不要使用冒泡排序。
  • @jimmcnamara 你读过这个问题吗?
  • 但是我必须对整数数组进行排序并使其成为 char 数组中的单词不会失去它们的价值 - 我将如何做到这一点?例如,如果最高整数在整数 [52] 中,那么我必须将它放在其数组的首位,以及单词 [52] 在其数组中的首位
  • @self 我今天不想做他的作业。他可以考虑一个结构数组,它们是指向两个数组中每个元素的指针,然后根据“计数”或单词对结构数组进行排序。是的,我确实读过这个问题。一部分是:使用冒泡排序或其他排序算法。其他就是答案。

标签: c arrays algorithm sorting qsort


【解决方案1】:

使用结构

struct word
{
  char word[100];
  int count;
};

struct word array[502];

使用来自stdlib.hqsort 函数对其进行排序。

int compare(const void* a, const void* b)
{

const struct array *ia = (const struct array *)a;
const struct array *ib = (const struct array *)b;
if(*ia.count>*ib.count)
    return 1;
else if(*ia.count==*ib.count)
    return 0;
else
    return -1;
}
qsort(array,502,sizeof(array[0]),compare);

【讨论】:

  • 放弃冒泡排序。只需根据需要更改数字
  • 什么是函数比较?
  • 由 qsort 函数使用。它比较两个参数并根据比较返回 +ve -ve 或 0 vakue。它以这种方式构建以增强灵活性。
  • 嗯,好的,你能告诉我如何为这个结构动态分配内存以及如何访问它吗?例如,如果我想要单词 495 和这个单词的计数器,我该怎么写?数组[495].word ?
  • 一个数组已经分配了内存。如果你使用指针,使用malloc。你使用.访问条目,例如strcpy(array[495].word,word);array[495].count=5;
【解决方案2】:

您可以构建一个结构数组。第一个条目是计数器,第二个条目是原始位置,并对其进行排序(通过 qsort())。因此像

typedef struct _entry {
    int cnt;
    int pos;
} entry;

entry *entries;

...
/* fill the entries table */
...
qsort(...); /* or some other sort */

由于您只移动两个整数,因此它比对字符数组进行排序要快得多。之后,你通过评估位置知道哪个计数属于哪个单词

【讨论】:

  • 更好的是存储指向字符串的指针而不是原始位置。
  • 它在检索字符串时保存重定向。所以我认为你是对的,尽管性能损失不会很大。我的方式,可以不假思索地构建阵列,一个接一个。在存储指向字符串的指针时,您必须同时构建数组。
【解决方案3】:

您调整了冒泡排序以同时处理两个数组。我认为您可以调整许多其他排序算法(例如quicksort)以同时处理两个数组。快速排序的中心子程序是swap,我认为您主要需要调整交换和比较标准,使其适用于两个数组。

另一种可能性是创建第三个数组,将单词与其出现“耦合”。您可以使用以下某种结构来做到这一点:

struct word_and_occurence {
   char** ptr_to_word;
   int occurences;
}

然后您可以只对 word_and_occurences 的数组进行排序,然后遍历该数组的排序版本并正确地重新调整字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    • 2022-12-02
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    相关资源
    最近更新 更多