java实现归并排序

     1 归并算法:思想:假设初始序列含有n个记录,进行两两归并,得到长度为不小于n/2的最大整数个两个一组或者一个一组的有序序列 然后再进行二二归并,知道完全有序。

	public static void mergingsort(short[] arr,int low,int high){
	if(low>=high)   return;
	else{
	int middle=(low+high)/2;
	//找到中间索引,进行二路归并
	mergingsort(arr, low, middle);
	mergingsort(arr, middle+1, high);
	merge(arr,low,middle,high);//将两个有序序列合并成一个有序序列
	}
	}
	//实现归并算法
	public static void merge(short[] arr,int low,int middle,int high){
		//申请一个相同大小的数组  归并算法需要的额外的内存空间与数组的长度成正比
		short [] temp=new short[arr.length];
		//最理想的情况是 后边数组的首项大于等于前边数组的尾项,可以在这里加一个判断
		int i=low;//索引指向前半部分数组
		int j=middle+1;//索引指向后半部分数组
		int k=0;//记录中间数组的索引
		for(;i<=middle&&j<=high;k++){
			if(arr[i]<=arr[j]){
				temp[k]=arr[i++];//前半数组"指针"后移
			}
			else{
				temp[k]=arr[j++];
			}
		}
                //此时 两个序列中只有一个序列的索引到达最后
		if(i<=middle)  
		 while (i <= middle) {
	            temp[k++] = arr[i++];
	        }
		else
		 while (j <= high) {
	            temp[k++] = arr[j++];
	        }
		//此时temp处于有序的状态,将数据返回arr 
		for(int n=0;n<k;n++){
			arr[low+n]=temp[n];//因为递归过程中 数组的起始位置是low  是一个可变的值
		}
	}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值