Java合并排序

时间:2014-04-19 21:25:35

标签: java sorting merge

这是我使用的java书籍提供的合并排序算法,但代码不起作用。它返回一个数组,其中包含一些重复的数字,这些数字不在原始数字列表中。任何想法为什么这个代码不工作,谢谢?编辑:运行它的输出是:" 7 2 12 4 2       所以它复制了2#s 2 2 2 4 12

public class Nothing1{

 public static void main(String[] args)
    {
        comp<Integer> c = new comp<Integer>();

        Integer[] values1 = new Integer[5];

        values1[0] = 7;
        values1[1] = 2;
        values1[2] = 12;
        values1[3] = 4;
        values1[4] = 2;

        for(int index= 0; index <= values1.length-1; ++index)
            {
                System.out.println(values1[index]);
            }

        c.mergeSort(values1);

        for(int index= 0; index <= values1.length-1; ++index)
            {
                System.out.println(values1[index]);
            }



    }

     public static <T extends Comparable<T>> void mergeSort(T[] data)
        {
            mergeSort(data, 0, data.length-1);
        }

        private static <T extends Comparable<T>> void mergeSort(T[] data, int min, int max)
        {
            if(min < max)
            {
                int mid = (min + max)/2;
                mergeSort(data, min, mid);
                mergeSort(data, mid+1, max);
                merge(data, min, mid, max);
            }
        }

        private static <T extends Comparable <T>> 
                void merge(T[] data, int first, int mid, int last)
        {
            T[] temp = (T[])(new Comparable[data.length]);

            int first1 = first, last1=mid;
            int first2 = mid+1, last2=last;
            int index = first1;

            while(first1 <= last1 && first2 <= last2)
            {
                if(data[first1].compareTo(data[first2]) < 0)
                {
                    temp[index] = data[first];
                    first1++;
                }
                else
                {
                    temp[index] = data[first2];
                    first2++;
                }
                index++;
            }

            while(first1 <= last1)
            {
                temp[index] = data[first1];
                first1++;
                index++;
            }

            while(first2 <= last2)
            {
                temp[index] = data[first2];
                first2++;
                index++;
            }

            for(index = first; index <=last; index++)
                data[index] = temp[index];
        }
}

2 个答案:

答案 0 :(得分:0)

您是否忘记更改其中一个变量,不是吗?

想象一下,当前合并数组中有4个和3个。

你的first1和last1是0 你的first2和last2是1

当你比较它时,你输入到else并将3复制到索引的第一个位置,这是正确的。然后你先移动一个。

但是4?你应该在3之后复制吧?就在索引的第二个位置。

也许我错了。

对不起,我的英语不好。

答案 1 :(得分:0)

错误基本上归结为merge函数中的拼写错误:

private static <T extends Comparable <T>> 
        void merge(T[] data, int first, int mid, int last)
{
    T[] temp = (T[])(new Comparable[data.length]);

    int first1 = first, last1=mid;
    int first2 = mid+1, last2=last;
    int index = first1;

    while(first1 <= last1 && first2 <= last2)
    {
        if(data[first1].compareTo(data[first2]) < 0)
        {
            // the next line has to use indices that can change during this loop
            temp[index] = data[first1]; // change in this line first->first1
            first1++;
        }
        else
        {
            temp[index] = data[first2];
            first2++;
        }
        index++;
    }
    //...

使用错误的代码,您的数组会遇到以下情况:

7 2 12 4  2 (initial state; merge indices 0;1 next)
2 7 12 4  2 (still correct; merge indices 0-1;2 next)
2 2 12 4  2 (error here)
2 2 12 2  4
2 2  2 4 12

在错误的合并步骤中会发生以下情况:

  1. 从索引0复制到索引0
  2. 从索引0复制到索引1(此处出错:应从索引1复制)
  3. 从索引2复制到索引2
  4. 发生错误,因为数据是从索引first读取的,但索引first1已更改