我正在做一个合并排序的版本,而不是将矢量划分为两个子矢量,只是将数组划分为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);
}
}
答案 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()
算法编写单元测试。