码迷,mamicode.com
首页 > 编程语言 > 详细

归并排序

时间:2018-11-22 17:12:32      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:归并排序   应该   顺序   eth   递归   数据   部分   合并   复制   

  1. 归并排序

归并排序的原理:归并排序是将一个集合分成两部分:part1和part2,分别对part1和part2进行排序(使用递归法,直到子集合的大小为1,则停止将集合拆分,此时因为子集合中只有一个元素,所以,这个子集合也就相当于已经拍好了顺序),最后将这两部分排好顺序的集合合并为一。

在编写代码的时候有几个注意点:

  1. 如何将集合分成两部分,各大小都为多少?

    集合的第一部分为list.length/2;集合的第二部分为list.length-list.length/2;

  2. 集合的递归调用什么时候停止?

    当子集合的大小为1时,则停止对集合划分,故在方法的一开始应该加上一个判断

    If(list.length > 1){

    };

代码实现:

public static void mergeSort(int[] list){

        if(list.length > 1){

            int[] half1 = new int[list.length/2];

            int[] half2 = new int[list.length - list.length/2];

            System.arraycopy(list, 0, half1, 0, half1.length);  //将集合的前半部分复制到half1中

            mergeSort(half1);

            System.arraycopy(list, list.length/2, half2, 0, half2.length); //将集合的后半部分复制到half2中

            mergeSort(half2);

            

            int[] temp = merge(half1,half2); //将两个集合合并

            System.arraycopy(temp, 0, list, 0, temp.length);

        }

    }

上段代码的merge方法的作用是将两个集合合并为一个并返回。

代码实现:

private static int[] merge(int[] list1, int[] list2){

        int[] temp = new int[list1.length + list2.length];

        int currentPosition1 = 0; //遍历list1时使用的下标变量

        int currentPosition2 = 0; //遍历list2时使用的下标变量

        int currentPositionTemp = 0; //合并两个list时使用的下标变量

 

        //将两个集合中的元素copy到临时变量中

while(currentPosition1 < list1.length && currentPosition2 < list2.length){             if(list1[currentPosition1] < list2[currentPosition2]){ //将小的元素放到前面。

                temp[currentPositionTemp++] = list1[currentPosition1++]; 

            }else

            {

                temp[currentPositionTemp++] = list2[currentPosition2++];

            }

        }

        //运行到此处时,list1和list2中的至少其中一个list已经全部复制到临时集合中,但有可能list1中元素的数量小于list2中元素

//的数量,因此,需要将list1或者list2中的剩余的数据复制到临时集合中。

        while(currentPosition1 < list1.length){

            temp[currentPositionTemp++] = list1[currentPosition1++];

        }

        while(currentPosition2 < list2.length){

            temp[currentPositionTemp++] = list2[currentPosition2++];

        }

        return temp;

    }

 

测试代码:

public static void main(String[] args) {

        // TODO Auto-generated method stub

        int[] list = {1,29,1,2,90,1,0};

        mergeSort(list);

        for(int temp : list){

            System.out.print(temp + " ");

        }

        System.out.println();

    }

运行结果:

归并排序

标签:归并排序   应该   顺序   eth   递归   数据   部分   合并   复制   

原文地址:https://www.cnblogs.com/feng9exe/p/10001797.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!