我想通過合併排序排序數組,並排序時,刪除我認爲相等的元素。我遞歸調用合併排序然後合併。合併排序刪除重複
我得到這一點,發現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];
}
}
'PickOne()'做了什麼? – 2013-05-08 07:00:21
在我看來,mergesort已經足夠複雜了,而沒有將專用代碼交織在一起刪除重複。我會建議兩個單獨的函數:首先合併數據,然後刪除重複項,這大概在排序數據中是連續的,因此很容易找到。 – Simon 2013-05-08 08:01:10
你已經標記了這個C和C++,但是'private static void ...'和'int [] temp = new int [end-start + 1];'表明這是另一種語言。你實際使用哪種語言? – 2013-05-08 10:03:02