归并排序

总的来说就是使用递归,分两步:

1.将初始序列划分成由n个长度为1的已排子序列组成,本题是对半分下去,直至元素个数为1,类似二分法。

2.两两子序列合并成已排序列,直至合并成初始数组。


public class MergeSort {
    //将有二个有序数列a[first...mid]和a[mid...last]合并。 
    static void mergearray(int a[], int first, int mid, int last, int[] temp) {


        int i = first, j = mid + 1;
        int m = mid, n = last;
        int k = 0;


        while (i <= m && j <= n) {
            if (a[i] <= a[j])
                temp[k++] = a[i++];
            else
                temp[k++] = a[j++];
        }
        //如果从mid到last的数据已经遍历完毕,将first到mid剩余的数据拷贝至sorted
        while (i <= m) {
            temp[k++] = a[i++];
        }
        //如果从first到mid的数据已经遍历完毕,将mid到last剩余的数据拷贝至sorted
        while (j <= n) {
            temp[k++] = a[j++];
        }
        //至此,temp[]为有序的数组
        //更改a[]中first至last元素顺序,使其排序
        for (i = 0; i < k; i++) {
            a[first + i] = temp[i];
        }
    }


    static void mergesort(int a[], int first, int last, int temp[]) {
        if (first < last) {
            int mid = (first + last) / 2;
            mergesort(a, first, mid, temp); //递归,将数组切割至最小(1个元素)
            mergesort(a, mid + 1, last, temp); //同上
            mergearray(a, first, mid, last, temp); //再将相邻的二个元素合并、排序,往上递归,直至最后合并成一个最大的有序数组 
        }
    }


    public static void main(String[] args) {
            int[] list = {5,3,8,4,6,7,2,1};  
            int[] temp = new int[list.length];
            MergeSort as = new MergeSort();
            as.mergesort(list, 0, list.length - 1,temp);
            for(int i=0;i<list.length;i++)  
            {  
                System.out.print(list[i]);  
            }  
        }
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值