Java学习手册:(数据结构与算法-排序)归并排序

算法思想:归并排序是用递归和分治方法将数据序列划分为越来越小的半子表,再对半子表排序,最后再用递归方法将排好序的半子表合并为越来越大的有序序列。

package com.haobi;
/*
 * 归并排序
 */
public class MergeSort {
	public static void merge(int[] array,int p,int q,int r) {//p-左边位置;q-中间点;r-右边位置;
		int  i,j,k;//循环所用到的参数
		int n1 = q-p+1;//n1-左边数组的长度
		int n2 = r-q;//n2-右边数组的长度
		int[] L = new int[n1];//L[]-左边数组
		int[] R = new int[n2];//R[]-右边数组
		for(i=0,k=p;i<n1;i++,k++) {//在数组中进行循环,将左数组对应的值赋值给左数组
			L[i] = array[k];
		}
		for(i=0,k=q+1;i<n2;i++,k++) {//在数组中进行循环,将右数组对应的值赋值给右数组
			R[i] = array[k];
		}
		for(k=p,i=0,j=0;i<n1&&j<n2;k++) {//同时对左右数组进行操作,当(i<n1&&j<n2)条件不满足时跳出循环
			if(L[i]<R[j]) {//如果左数组元素小于右数组元素
				array[k] = L[i];//左数组元素存进数组
				i++;
			}else {//左数组元素大于右数组
				array[k] = R[j];//右数组元素存进数组
				j++;
			}
			if(i<n1) {//i<n1,则说明左数组有剩余(右数组遍历完成),即剩下数组中的元素依次存入数组尾部
				for(j=i;j<n1;j++,k++) {
					array[k] = L[j];
				}
			}
			if(j<n2) {////j<n2,则说明右数组有剩余(左数组遍历完成),即剩下数组中的元素依次存入数组尾部
				for(i=j;i<n2;i++,k++) {
					array[k] = R[i];
				}
			}
		}
	}
	public static void mergeSort(int[] array, int p,int r) {
		if(p<r) {
			int q = (p+r)/2;//设置q为p和r的中间点
			mergeSort(array,p,q);//左半部分进行归并排序
			mergeSort(array,q+1,r);//右半部分进行归并排序
			merge(array,p,q,r);//对排好序的半子表进行合并
		}
	}
	public static void main(String[] args) {
		int[] array = {19,13,5,27,1,26,31,16};
		mergeSort(array,0,array.length-1);
		for(int i=0;i<array.length;i++) {
			System.out.print(array[i]+" ");
		}
	}
}

程序输出结果如下:

1 5 13 19 26 27 31 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值