在java中排序合并代码需要一些澄清

时间:2016-12-07 09:31:19

标签: java

你能解释一下以下几行吗(我把它放在需要解释的每一行的前面)。提前致谢 ! 我知道 : 对具有n个元素的输入序列S进行合并排序包括三个步骤: 除以:将S分成两个序列S1和S2,每个序列约为n / 2个元素 重复:递归排序S1和S2 征服:将S1和S2合并为一个独特的排序序列

但是当我读到我迷失方向的代码时,你能不能指引我。

public class MergeSort {
        public static int[] mergeSort(int [] list) {
            if (list.length <= 1) {
                return list;
            }

            // Split the array in half
            int[] first = new int[list.length / 2];  // ok
            int[] second = new int[list.length - first.length]; // ?
            System.arraycopy(list, 0, first, 0, first.length);  // ?
            System.arraycopy(list, first.length, second, 0, second.length); // not sure ?

            // Sort each half
            mergeSort(first); // ok
            mergeSort(second); // ok

            // Merge the halves together, overwriting the original array
            merge(first, second, list); // ok
            return list; // ok
        }

        private static void merge(int[] first, int[] second, int [] result) { // explain in general ?
            // Merge both halves into the result array
            // Next element to consider in the first array
            int iFirst = 0;
            // Next element to consider in the second array
            int iSecond = 0;

            // Next open position in the result
            int j = 0;
            // As long as neither iFirst nor iSecond is past the end, move the
            // smaller element into the result.
            while (iFirst < first.length && iSecond < second.length) { // ??!!
                if (first[iFirst] < second[iSecond]) {
                    result[j] = first[iFirst];
                    iFirst++;
                    } else {
                    result[j] = second[iSecond];
                    iSecond++;
                }
                j++;
            }
            // copy what's left
            System.arraycopy(first, iFirst, result, j, first.length - iFirst);
            System.arraycopy(second, iSecond, result, j, second.length - iSecond);
        }

        public static void main(String args[]) throws Exception
        {
            String list="";
            int i=0,n=0;

            MergeSort s= new MergeSort();
            ArrayList<Integer> arrlist=new ArrayList<Integer>();
            System.out.println(" ");
            System.out.println(" ");
            System.out.println("Please enter the list of elements,one element per line");
            System.out.println(" write 'STOP' when list is completed ");
            BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
            while(!(list=bf.readLine()).equalsIgnoreCase("stop")){
                int intelement=Integer.parseInt(list);
                arrlist.add(intelement);

            }

            int elementlist[]  = new int[arrlist.size()];
            Iterator<Integer> iter = arrlist.iterator();
            for (int j=0;iter.hasNext();j++) {
                elementlist[j] = iter.next();
            }

            elementlist=mergeSort(elementlist); // ?
            System.out.println(" ");
            System.out.println(" ");
            System.out.println(" ");
            System.out.println("Values after Merge Sort : ");
            for (int j=0;j<elementlist.length;j++) {
                System.out.println(elementlist[j]+" ");
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

int[] first = new int[list.length / 2];int[] second = new int[list.length - first.length];方法中将列表划分为2个数组,假设您的列表长度为5,首先将其中2作为其大小,3作为第二个。在

System.arraycopy(list, 0, first, 0, first.length); 
System.arraycopy(list, first.length, second, 0, second.length);

从列表数组中填充第一个和第二个数组(将list[0],list[1]复制到第一个数组,将list[2],list[3],list[4]复制到第二个数组。

private static void merge(int[] first, int[] second, int [] result)中,您正在合并firstsecond数组并覆盖result数组 在while循环中,您获取第一个和第二个数组的第一个元素并比较它们并将最小值移动到result[0]然后通过使用if and else语句相应地将指针递增到数组,现在您已经放置在first中的secondresult[0]数组中的最小元素。

您递增j,这意味着在此次迭代中,您将第二个最小元素放在result[1]中,依此类推。

elementlist=mergeSort(elementlist);中,您通过调用elementlist方法对mergeSort(int [] list);进行排序。