归并排序

来源:互联网 发布:淘宝买的电影票能退吗 编辑:程序博客网 时间:2024/06/06 06:45

归并算法的基本概念:
假设有两个已经排序好的数组a和数组b,以及一个临时存储数组temp。设a_pos为指向a数组的指针,b_pos为指向b数组的指针,其初始值均为0.比较a[a_pos]与b[b_pos],取较小(升序,如果想得到降序序列则取较大)的那个值放入临时数组,并且取值后的数组指针后移。重复操作直到其中一个数组的所有值都取遍,而后将另一个数组的剩下的值放入temp数组中,这样就得到了排序后的数组。

示例图(截自《数据结构与算法分析_java语言描述第二版》):
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

那么,如果我们要对一个输入数组a进行归并排序该怎么做?
这里,我们用到了一个分治的思想。
分:将序列一分为二,对独立出来的数组分别进行排序。
治:对排序后的数组进行归并(如上所描述)。
在程序中,递归的进行分治,就能得到最终的排序数组。

代码:

package mergesort;public class mergesort {    public void mergeSort(int[] a, int[] temp, int left, int right)    {        if( left < right )        {            int mid = ( left + right ) / 2;            mergeSort(a, temp, left, mid);            mergeSort(a, temp, mid+1, right);            merge(a,temp,left,mid+1,right);        }    }    public void mergeSort(int[] a)    {        int[] temp = new int[a.length];        mergeSort(a,temp,0,a.length-1);    }    //主要的处理程序    public void merge(int[] a, int[] temp, int leftpos, int rightpos, int rightend)    {        int leftend = rightpos-1;        int temppos = leftpos;        int num = rightend-leftpos+1;        //主循环        while(leftpos<=leftend&&rightpos<=rightend)        {            if(a[leftpos]<=a[rightpos])                temp[temppos++] = a[leftpos++];            else if(a[leftpos]>a[rightpos])                temp[temppos++] = a[rightpos++];        }        while(leftpos<=leftend)            temp[temppos++] = a[leftpos++];        while(rightpos<=rightend)            temp[temppos++] = a[rightpos++];        for(int i=0;i<num;i++,rightend--)            a[rightend] = temp[rightend];    }    public static void main(String[] args)    {        mergesort m = new mergesort();        int[] a = {2,1,6,5,4,3,2};        for(int temp : a)            System.out.print(temp);        System.out.println();        m.mergeSort(a);        for(int temp : a)            System.out.print(temp);        System.out.println();    }}

输出:
这里写图片描述

0 0