分治法之经典算法一--合并排序

最近打算把算法捋一捋,这次是分治法的典型例子:合并排序。需要的朋友请自取哦!欢迎大家和我一起交流~~

1.合并排序算法思想:
将待排序的有n个元素的序列分割成两个规模大小相同的子数组,如果子数组规模到达容易求出排序时停止分割,否则继续分割。直到容易求出排序也就是子数组只有单元素时,我们把它视为容易解决排序的问题规模,我们认为这个具有单元素的子数组已经排好序,然后将两两相邻的子数组合并成所要求的序列,直到不再存在未合并的子数组,算法终止。
步骤:
先将待排序列分割成子数组;
当子数组只有单个元素时停止分割;
将这些子数组两两合并。

2.代码如下:
‘’’
//分治法_合并排序;
public class MergeSort {

public static void MergeSort1(Comparable a[],int left,int right){
	Comparable []b =new Comparable[right+1];
	if(left<right) {//至少俩元素
		int i=(left+right)/2;//取中点
		MergeSort1(a,left,i);//处理左半段
		MergeSort1(a,i+1,right);//处理右半段
		Merge(a,b,left,i,right);//将两段序列合并成有序结果
		Copy(a,b,left,right);//复制
	}
}


//合并排序,把两段待排序序列合并成有序结果
 static void Merge(Comparable [ ] c, Comparable  d[ ] ,int l, int m , int r) {
	
		int i=l;//第一段的游标(起始位置)
		int j=m+1;//第二段的游标(起始位置)
		int k=l;//结果的游标
		//只要段里面存在i和j,不断进行归并
		while((i<=m)&&(j<=r)) {
			if(c[i].compareTo(c[j])<=0)
				d[k++]=c[i++];
			else d[k++]=c[j++];
		}
		//把余下部分加入到数组中
		if(i>m) {
			for(int q=j;q<=r;q++) 
				d[k++]=c[q];
			}
		else {
			for(int q=i;q<=m;q++)
				d[k++]=c[q];
		}
	
}
 //复制数组
  static void Copy(Comparable[] a, Comparable[] b, int left, int right) {
		for(int i=left;i<=right;i++) {
			a[i]=b[i];
		}
		
	}
public static void main(String[] args) {
	Comparable[] a= {23,5,9,16,30,25,17,18};
	MergeSort1(a,0,7);
	System.out.println("合并排序后结果:");
	for(int i=0;i<=7;i++) {
		System.out.print(a[i]+" ");
	}
	

}

}

‘’’

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值