归并排序(JAVA语言描述)

归并排序是与插入排序、冒泡排序、选择排序不同的另一类排序方法。归并的含义是将两个有序表合成一个新的有序的表。
归并排序的基本思想是,将待排记录r[0]到r[n-1]看作是一个含有n个长度为一的有序子表,把这些子表依次进行两两归并,得到[n/2]个有序的子表;然后再把[n/2]个有序子表进行两两归并,一直重复,最后得到一个长度为n的有序子表为止。
算法性能分析
(1)时间复杂度:归并排序的归并趟数为[logn],而每一次归并就是将两两有序序列合并,其数据移动次数为n,及每一趟归并的时间复杂度为O(n),总共归并了n趟,所以归并排序时间复杂度为O(nlogn).
(2)空间复杂度:归并排序需要一个与待排序序列等长的辅助数组来存放排序过程的中间结果,所以空间复杂度为O(n).
(3)算法稳定性:归并排序是一种稳定的排序算法
归并排序代码:

import java.util.Scanner;

/**
 * 类名:MergeSort<br>
 * 功能:归并排序<br>
 * 作者:java战士<br>
 * 日期:2019/8/14<br>
 * 版本:v1.0.0
 * 历史修订:
 */
public class MergeSort {

    public static void mergeSort(int[] arr){
        if (arr==null||arr.length<2){
            return;
        }
        mergeSort(arr,0,arr.length-1);
    }
    public static void mergeSort(int[] arr,int l,int r){
        if (l==r){
            return;
        }
        int mid=l+((r-l)>>1);
        //递归思想
        mergeSort(arr,l,mid);
        mergeSort(arr,mid+1,r);
        merge(arr,mid,l,r);
    }

    public static void merge(int[] arr,int mid,int l,int r){
        int[] help=new int[r-l+1];
        int i=0;
        int p1=l;
        int p2=mid+1;
        while (p1<=mid && p2<=r){
            //核心点,p1和p2分别为数组的牵绊部分和后半部分的元素,游标那个元素小,就先放到辅助数组中,然后继续比较,以此类推
            help[i++]=arr[p2]>arr[p1]?arr[p1++]:arr[p2++];
        }
        while (p1<=mid){
            help[i++]=arr[p1++];
        }
        while (p2<=r){
            help[i++]=arr[p2++];
        }
        for (i=0;i<help.length;i++){
            arr[l+i]=help[i];
        }

    }
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        String str=scanner.next().toString();
        String[] arr=str.split(",");
        int[] arr1=new int[arr.length];
        for (int i=0;i<arr.length;i++){
            arr1[i]=Integer.parseInt(arr[i]);
        }
        mergeSort(arr1);
        for (int i=0;i<arr1.length;i++){
            System.out.print(arr1[i]+" ");
        }
    }
}

测试结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值