如何合并排序?只需要知道我错在哪里

时间:2016-06-14 19:43:00

标签: java sorting merge

我已经开始在java中编程并尝试学习合并排序。我得到了算法并用它编码。我不明白我错了哪一部分。有人可以帮我解决合并排序和调试此代码。

public class Main {

     public static void main(String[] args) {

     // Merge Sort

    int[] myArray = {2, 4, 1, 6, 8, 5, 3, 7};


        mergeSort(myArray);
        System.out.println((Arrays.toString(myArray)));
    }
    public static void mergeSort(int []toSortArray){
       int n= toSortArray.length;
       if (n < 2) {
        return;
       }
    int mid = n/2;
    int [] Left= new int [mid];
    int []Right = new int[n-mid];
    for(int i=0;i<mid-1;i++){
        Left[i]=toSortArray[i];
    }
    for(int i=mid;i<n-1;i++){
        Right[i-mid]=toSortArray[i];
    }
    mergeSort(Left);
    mergeSort(Right);
    merge(Left,Right,toSortArray);

}

public static void merge(int[] Left, int [] Right, int []SortedArray){
    int nL = Left.length;
    int nR= Right.length;

    int i=0;//Index position for left array
    int j=0;// index of position of Right array
    int k=0;// Index position of sorted Array

    while (i<nL && j<nR){
        if (Left[i]<Right[j]) {
            SortedArray[k] = Left[i];
            i++;
            k++;
        }
        if (Right[j]<Left[i]){
            SortedArray[k] = Right[j];
            j++;
            k++;
        }
    }
    while(i<nL){
        SortedArray[k]=Left[i];
        i++;
        k++;
    } while (j<nR){
        SortedArray[k]= Right[j];
        j++;
        k++;
    }

}

}

1 个答案:

答案 0 :(得分:0)

在mergeSort()中,复制数据的两个循环应该是i&lt; mid(不是i&lt; mid-1)和i&lt; n(不是我&lt; n-1)。

在merge()中,第一个if应该是if(Left [i]&lt; = Right [j])(不仅仅是&lt;)。第二个if(Right [j]&lt; Left [i])可以用else替换(不需要第二个if)。

以下代码似乎正在运作:

  //XElement xFile = XElement.Load("D:/Sample.xml");
        XElement xFile = XElement.Parse
            (@"<File>
                  <Cars>
                    <Car>
                      <Color>Blue</Color>
                      <Year>1988</Year>
                    </Car>
                    <Car>
                      <Color>Green</Color>
                      <Year>1989</Year>
                    </Car>
                    <Car>
                      <Color>Yellow</Color>
                      <Year>1989</Year>
                    </Car>
                  </Cars>
                </File> ");
        List<condition> c = new List<condition>
                        {
                            new condition()
                            {
                                color = "Green",
                                year = "1989"
                            },
                            new condition()
                            {
                                color = "Blue",
                                year = "1988"
                            }
                        };
        var s = new XElement("Cars",
                from cc in c
                select new XElement("Car",
                    new XElement("Color", cc.color),
                    new XElement("Year", cc.year)
                )   

                );  
        var result = xFile.Descendants("Cars").Intersect(s.Descendants("Cars"));

        var fileXML = new XElement("File", result);
        fileXML.Save("D:/Result.xml");