合并排序三个子矢量

时间:2013-12-01 06:00:12

标签: c vector mergesort

我正在做一个合并排序的版本,而不是将矢量划分为两个子矢量,只是将数组划分为3个子矢量只是我在本文中遇到问题该算法只对该程序有效关闭,我可以帮助,请按照下面的代码审查:

void Intercala(int v[],int inicio,int meio1,int meio2,int fim)
{
int i,j,k,*w;
w=(int*)malloc((fim-inicio)*sizeof(int));
i=inicio;
j=meio1;
l=meio2;
k=0;
while(i<meio1&&j<meio2)
{
    if(v[i]<=v[j])
        w[k++]=v[i++];
    else
        w[k++]=v[j++];
}
while(l<fim)
{
    w[k++]=v[l++];

}
while(i<meio1)
    w[k++]=v[i++];
while(j<meio2)
    w[k++]=v[j++];
while(l<fim)
    w[k++]=v[l++];
for(i=inicio;i<fim;i++)
    v[i]=w[i-inicio];
free(w);        
}
void Merge_Sort(int v[],int inicio,int fim)
{
int meio1,meio2;
if(inicio<fim-1)
{
    meio1=(inicio+fim)/3;
    meio2=meio1*2;
    Merge_Sort(v,inicio,meio1);
    Merge_Sort(v,meio1,meio2);
    Merge_Sort(v,meio2,fim);
    Intercala(v,inicio,meio1,meio2,fim);
}
}

1 个答案:

答案 0 :(得分:1)

Merge sort是一种分而治之的算法。在标准实现中,首先将列表拆分为两个子列表,递归地对这两个列表进行排序,然后将这两个排序列表合并为一个排序列表。

有三个子向量,它是完全相同的,除了你需要调整你的除法和合并逻辑来处理三个向量而不是两个。从较高的层面来看,它看起来应该是这样的:

void merge_sort(int v[], int len)
{
    /* Code to handle the base case (lists of length 1) */
    /* ... */

    /* v1-v3, len1-len3 are out parameters */
    divide(v, v1, &len1, v2, len2, v3, len3);

    merge_sort(v1, len1);
    merge_sort(v2, len2);
    merge_sort(v3, len3);

    merge(v, len, v1, len1, v2, len2, v3, len3);
}

不幸的是,我不会说代码最初编写的语言,因此我无法理解代码的原始意图,但我提出的一些问题/建议包括:

  • 您是否正确处理基本情况?
  • 为什么Intercala()会动态分配额外的内存?这在合并排序中不是必需的,因为合并排序可以就位。
  • 此问题非常适合单元测试 - 对于任何输入,您都可以轻松确定输出。因此,请考虑为Intercala()编写一些单元测试,以确定它是否适用于您能想到的所有情况。知道Intercala()后,请考虑为整个Merge_Sort()算法编写单元测试。
祝你好运!