簡體   English   中英

合並排序(看似隨機重復)

[英]Merge Sorting (seemingly random duplications)

因此,我為合並排序器提供的代碼有一個小錯誤,其中數組列表中的一些項目將被復制並扔到一個奇怪的位置

Sorted List    Unsorted List
apricot        gray
aqua           maize
bittersweet    mahogany
blue           green
brick          red
cornflower     apricot
flesh          bittersweet
gray           flesh
green          cornflower
lemon          orchid
magenta        pink
maize          orange
mahogany       maroon
bittersweet    blue
melon          yellow
orange         melon
orange         magenta
maroon         violet
blue           silver
pearl          tan
periwinkle     periwinkle
purple         turquoise
purple         thistle
olive          white
purple         sienna
tan            lemon
turquoise      pearl
brick          aqua
olive          brick
purple         olive
purple         purple

這是我編寫的代碼,感謝您提供的所有反饋:

ArrayList<String> a = new ArrayList<String>();

public MergeSorter(ArrayList<String> aList)
{
    a = aList;
}

public void sort()
{
    if (a.size() <= 1) return;
    ArrayList<String> first = new ArrayList<String>();
    ArrayList<String> second = new ArrayList<String>();
    for (int i = 0; i < a.size()/2; i++)
        first.add(a.get(i));
    for (int i = a.size()/2; i < a.size(); i++)
        second.add(a.get(i));
    MergeSorter firstSorter = new MergeSorter(first);
    MergeSorter secondSorter = new MergeSorter(second);
    firstSorter.sort();
    secondSorter.sort();
    merge(first, second);
}

private void merge(ArrayList<String> first, ArrayList<String> second)
{
    int iFirst = 0;
    int iSecond = 0;
    int j = 0;

    while(iFirst < first.size() && iSecond < second.size())
    {
        if(first.get(iFirst).compareTo(second.get(iSecond)) < 0)
        {
            a.set(j, first.get(iFirst));
            iFirst++;
        }
        else
        {
            a.set(j, second.get(iSecond));
            iSecond++;
        }
        j++;
    }
    //System.arraycopy(first, iFirst, a, j, first.size() - iFirst);
    for (int i = iFirst; i < first.size() - iFirst; i++)
    {
        a.set(j, first.get(i));
        j++;
    }

    //System.arraycopy(second, iSecond, a, j, second.size() - iSecond);
    for (int i = iSecond; i < second.size() - iSecond; i++)
    {
        a.set(j, second.get(i));
        j++;
    }

}

}

您沒有足夠迭代:

for (int i = iFirst; i < first.size() - iFirst; i++)
{
    a.set(j, first.get(i));
    j++;
}
for (int i = iSecond; i < second.size() - iSecond; i++)
{
    a.set(j, second.get(i));
    j++;
}

至此,其中一個列表已被完全消耗掉,您只需要將另一個列表的所有其余元素復制到結果列表中即可。 這意味着從“結尾的開始”( iFirst )迭代到列表的結尾( first.size() )。

由於某些原因,您減去了iFirst ,因此並非所有值都被復制。 而是將未排序的值(用於初始化排序程序的值)保留在列表的末尾,其中一些將與實際排序的結果列表部分重復。

這應該工作:

for (int i = iFirst; i < first.size(); i++)
{
    a.set(j, first.get(i));
    j++;
}
for (int i = iSecond; i < second.size(); i++)
{
    a.set(j, second.get(i));
    j++;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM