归并排序

<span style="font-family: Arial, Helvetica, sans-serif;">public class MergeSort {</span>
    public int[] mergeSort(int[] A, int n) {
       sort(A,0,n-1);
       return A;
    }
     
	    public void sort(int[] data,int left,int right){
	        if(left<right){
	            int middle=(left+right)/2;
	            //划分左右
	            sort(data,left,middle);
	           	sort(data,middle+1,right);
	            //合并左右
	            merge(data,left,middle,right);
	        }
	    }
	    
	    //合并左右两个子数组
	    public void merge(int[] data,int left,int middle,int right){
	        //临时数组
	        int[] tempArr=new int[right-left+1];//空间复杂度O(N)
	        //左边数组游标
	        int leftIndex=left;
	        //右边数据游标
	        int rightIndex=middle+1;
	        //临时数组游标
	        int tempIndex=0;
	        
	        while(leftIndex<=middle&&rightIndex<=right){
	            //临时数组选取左、右子数组中小数值
	           if(data[leftIndex]<data[rightIndex]){
	               tempArr[tempIndex++]=data[leftIndex++];//如果左小,则插入临时数组,并用左边下一个和右边比较
	           }else{
	               tempArr[tempIndex++]=data[rightIndex++];
	           }
	        }
	        //剩余的直接放入
	        while(leftIndex<=middle){
	               tempArr[tempIndex++]=data[leftIndex++];
	        }
	        //剩余的直接放入
	        while(rightIndex<=right){
	               tempArr[tempIndex++]=data[rightIndex++];
	        }
	        //将临时数组放回原数组相应位置
	        int temp=0;
	        while((temp+left)<=right){
	            data[left+temp]=tempArr[temp];
	            temp++;
	        }
	    }
}

归并排序先让数组变成每个长度为一的有序空间,再两两合并成长度为二的有序区间,然后是长度为四的有序区间,直到合并成一个完整的有序区间,这种叫做二路归并排序。其核心就是将前后两个有序的数组合并为一个有序数组,其时间复杂度为O(nlogn),空间复杂度为O(N)。再性能上算是一种比较快的排序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值