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]+" ");
            }
        }
    }
一个Sdi

int[] first = new int[list.length / 2];andint[] 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数组并resultwhile循环中覆盖数组的过程中,您将第一个和第二个数组的第一个元素进行比较,然后移动最小的元素,result[0]然后通过使用if and else语句将指针相应地增加到数组,现在这两个元素中的元素都最小first以及second放置在中的数组result[0]

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我需要澄清一些代码示例

来自分类Dev

排序一些代码,我需要缩短它

来自分类Dev

需要在python代码中解释一些术语

来自分类Dev

需要一些代码的解释。

来自分类Dev

Java OOP理论有一些澄清吗?

来自分类Dev

当我需要其他分支的一些代码(未在development分支中合并)时,如何为功能创建分支

来自分类Dev

原型和obj一些澄清

来自分类Dev

需要从上一次提交中获取一些代码-Sourcetree

来自分类Dev

需要从上一次提交中获取一些代码-Sourcetree

来自分类Dev

需要一些解释才能理解此统一游戏教程中的获取属性代码

来自分类Dev

从代码中删除一些bbcode

来自分类Dev

我需要一些关于排序节点的解释

来自分类Dev

需要对DAG(有向无环图)进行一些澄清

来自分类Dev

需要对numpy索引进行一些澄清吗?

来自分类Dev

需要对Bower,Grunt和Bootstrap工作流程进行一些澄清和批评

来自分类Dev

让vs成员进入F#,需要澄清一些内容

来自分类Dev

我需要一些澄清,是否应该(可以?)取消分配与视图相关的UI元素

来自分类Dev

需要一些帮助将 Java 代码 Android Studio 移植到 C# Visual Studio

来自分类Dev

需要一些建议,以避免Selenium Webdriver @Test方法中的重复代码

来自分类Dev

需要一些帮助来理解一些代码

来自分类Dev

在简单的 Python 代码中排序的一些问题

来自分类Dev

需要一些帮助的论坛代码mysql php

来自分类Dev

我需要一些帮助来优化python代码

来自分类Dev

需要在代码中进行一些修改

来自分类Dev

需要帮助理解一些代码示例?

来自分类Dev

需要一些关于 jQuery 代码优化的技巧

来自分类Dev

合并一些行

来自分类Dev

需要一些建议

来自分类Dev

需要有关Java中的Lambda表达式的一些帮助

Related 相关文章

  1. 1

    我需要澄清一些代码示例

  2. 2

    排序一些代码,我需要缩短它

  3. 3

    需要在python代码中解释一些术语

  4. 4

    需要一些代码的解释。

  5. 5

    Java OOP理论有一些澄清吗?

  6. 6

    当我需要其他分支的一些代码(未在development分支中合并)时,如何为功能创建分支

  7. 7

    原型和obj一些澄清

  8. 8

    需要从上一次提交中获取一些代码-Sourcetree

  9. 9

    需要从上一次提交中获取一些代码-Sourcetree

  10. 10

    需要一些解释才能理解此统一游戏教程中的获取属性代码

  11. 11

    从代码中删除一些bbcode

  12. 12

    我需要一些关于排序节点的解释

  13. 13

    需要对DAG(有向无环图)进行一些澄清

  14. 14

    需要对numpy索引进行一些澄清吗?

  15. 15

    需要对Bower,Grunt和Bootstrap工作流程进行一些澄清和批评

  16. 16

    让vs成员进入F#,需要澄清一些内容

  17. 17

    我需要一些澄清,是否应该(可以?)取消分配与视图相关的UI元素

  18. 18

    需要一些帮助将 Java 代码 Android Studio 移植到 C# Visual Studio

  19. 19

    需要一些建议,以避免Selenium Webdriver @Test方法中的重复代码

  20. 20

    需要一些帮助来理解一些代码

  21. 21

    在简单的 Python 代码中排序的一些问题

  22. 22

    需要一些帮助的论坛代码mysql php

  23. 23

    我需要一些帮助来优化python代码

  24. 24

    需要在代码中进行一些修改

  25. 25

    需要帮助理解一些代码示例?

  26. 26

    需要一些关于 jQuery 代码优化的技巧

  27. 27

    合并一些行

  28. 28

    需要一些建议

  29. 29

    需要有关Java中的Lambda表达式的一些帮助

热门标签

归档