我正在尝试通过合并排序对数组进行排序,并在排序时删除我认为相等的元素。我递归地调用合并排序然后合并。
我到了这一点,发现a
并且c
是重复的。
a b | c d
我根据某些标准确定我想要哪一个,然后选择 c。我增加右手计数器和左手计数器并比较b和d。说我选d,然后我选b。我希望我的最终列表只有元素
c d b
但是,正在发生的事情发生在下一次递归调用中,start
并且end
是 0 和 3,因此 d 在下一次调用时在数组中列出了两次。合并过程使用的数组是:
c d b d
这是代码。提前致谢。
private static void merge(int[] data, int start, int mid, int end)
{
int firstCopied=0;
int secondCopied=0;
int index=0;
int length=end-start+1;
int[] temp = new int[end-start+1];
int firstSize=mid-start+1;
int secondSize=end-mid;
while(firstCopied < firstSize && secondCopied < secondSize)
{
if(data[start+firstCopied] < data[mid+1+secondCopied])
{
temp[index++] = data[start+firstCopied];
firstCopied++;
}
else if(data[start+firstCopied] > data[mid+1+secondCopied])
{
temp[index++] = data[mid+1+secondCopied];
secondCopied++;
}
else if(data[start+firstCopied]==data[mid+1+secondCopied])
{
boolean result = PickOne();
if(result)
{
temp[index++] = data[start+firstCopied];
}
else
{
temp[index++] = data[mid+1+secondCopied];
}
firstCopied++;
secondCopied++;
length--;
}
}
while(firstCopied < firstSize)
{
temp[index++] = data[start+firstCopied];
firstCopied++;
}
while(secondCopied < secondSize)
{
temp[index++] = data[mid+1+secondCopied];
secondCopied++;
}
for(int i=0; i<length; i++)
{
data[start+i]=temp[i];
}
}