排序算法总结(四)——归并排序排序

归并排序
归并排序利用了两个有序序列合并的过程;
两个有序序列合并的过程通常为:设置两个指针分别指向两个序列的头部,依次扫描比较两个序列数值的大小,并不断取出较小的值;在比较的过程中,如果其中一个序列为空,则将另一个序列剩余的值全部取出。

那么归并排序的基本思想是将无序序列分成两个部分,而这两个部分各自为有序的,再将其按照上诉步骤合并即可。
那在什么情况下才两个部分才能是有序的,当每个部分都只有一个元素时即各自有序;
所以使用递归的方式,序列分成分散的组,再进行合并实现归并排序。

以下图为例,详细描述归并排序过程:
(图片来自http://blog.csdn.net/jianyuerensheng/article/details/51262984 ,侵权删)
这里写图片描述

代码实现如下:

public class MergeSort {

    public static void main(String[] args) {
        int[] a = {4,2,3,1,7,6};
        sort(a,0,a.length-1);
        for(int i = 0;i<a.length;i++)
            System.out.println(a[i]);
    }

    public static void merge(int a[], int left, int right){
        int[] temp = new int[right-left+1];//设置临时数组变量,存放和合并结果
        int mid = (left + right)/2;

        int l = left; //第一个序列的头部
        int r = mid + 1; //第二序列的头部
        int i = 0;

        //合并两个有序序列
        while(l<=mid && r<=right){
            if(a[l]<a[r])
                temp[i++] = a[l++];
            else
                temp[i++] = a[r++]; 
        }
        //第二个序列为空了
        while(l<=mid){
            temp[i++] = a[l++];
        }
        //第一个序列为空了
        while(r <= right){
            temp[i++] = a[r++];
        }
        //将合并结果返回到a
        for(int j = 0;j<temp.length;j++){
            a[left+j] = temp[j];
        }
    }

    public static void sort(int a[],int left,int right){
        int mid = (left+right)/2;

        if(left<right){
            //首先对两个部分排序
            sort(a,left,mid);
            sort(a,mid+1,right);
            //然后合并两个有序部分
            merge(a,left,right);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值