【问题标题】:Keeping original indexes while sorting using Merge Sort in c在 c 中使用合并排序进行排序时保留原始索引
【发布时间】:2016-01-19 08:14:21
【问题描述】:

我正在尝试使用合并排序算法对列表进行排序,同时保留其原始索引。有人告诉我,直接的解决方案是使用索引数组(显然它将被初始化为 0 1 2 3 ...),并在合并排序中更改它,因为我更改了原始中的相应值大批。 问题是,我找不到让它工作的方法,因为合并排序不使用原始数组的索引,而是使用原始数组拆分成的小数组的索引。我想我在这里遗漏了一些东西......到目前为止我想到的解决方案是将索引数组视为原始数组,我的意思是将其拆分为更小的数组,为新索引声明一个“helperIndexArray”,调用合并与这些变量等......但它似乎真的效率低下。没有更好的方法吗? 我会很感激任何提示,谢谢!

void internalMsort(int array[], int size, int helperArray[], int index[]) {
    int left = size / 2, right = size - left;
    if (size < 2)
        return;
    internalMsort(array, left, helperArray);
    internalMsort(array + left, right, helperArray);
    merge(array, left, array + left, right, helperArray, index);
    memCpy(array, helperArray, size);
}

void merge(int a[], int na, int b[], int nb, int c[], index[]) {
int ia, ib, ic;
   for(ia = ib = ic = 0; (ia < na) && (ib < nb); ic++)
     {
       if(a[ia] < b[ib]) {
           c[ic] = a[ia];
           ia++;
           // here I was trying to swap index[ic] with index[ia] but it didn't work
       }
       else {
           c[ic] = b[ib];
           ib++;
       }
   }
   for(;ia < na; ia++, ic++){ c[ic] = a[ia]; }
   for(;ib < nb; ib++, ic++) { c[ic] = b[ib]; }
}

【问题讨论】:

    标签: c arrays sorting mergesort


    【解决方案1】:

    定义一个称为元组的新类型:

    typedef struct
    {
        int value;
        size_t index;
    } tuple;
    

    创建一个元组数组,用值填充它,并按顺序设置索引,从 0 到 size-1。

    然后使用成员值对数组进行排序,忽略成员索引。

    结果数组将被排序,其元素将包含成员索引中的原始索引。

    【讨论】:

      【解决方案2】:

      这很容易(并不特定于mergesort)。只需创建一个数组

       struct element_and_index_st  {
          int element;
          size_t original_index; // could be an `int` or an `unsigned`
       };
      

      并对该数组进行排序,提供仅比较 element 字段的比较函数。

      (除非您的阵列很大,您实际上可以在当前的台式机或笔记本电脑上将original_index 设置为intunsigned,其中ints 至少有32 位)支持>

      但是您没有说明为什么需要原始索引以及如何将它们还给调用者?

      也许你只是想要一些stable sort

      【讨论】:

        【解决方案3】:

        首先根据数组对索引进行排序(比较 array[index[ia]]

            for(i = 0; i < size; i++)
                helperArray = array[index[i]];
            for(i = 0; i < size; i++)
                array[i] = helperArray[i];
        

        【讨论】:

          猜你喜欢
          • 2017-07-12
          • 1970-01-01
          • 1970-01-01
          • 2019-10-19
          • 2011-11-04
          • 1970-01-01
          • 2016-01-01
          • 2021-04-15
          • 2021-08-06
          相关资源
          最近更新 更多