归并排序---------数构

题目:排序

输入:
3 0 7 4
10 3 4 -9 0 4 5 4 2 9 23
输出:
3 0 7 4
10 3 4 -9 0 4 5 4 2 9 23

归并排序算法是将相邻的两个排序子序列合并成一个排序子序列,分治策略.

(1)递推法:

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner  cin = new Scanner(System.in);
		while(cin.hasNext()){
			int n=cin.nextInt();
			int a[]=new int[n];
			for(int i=0;i<n;i++){
				a[i]=cin.nextInt();
			}
			mergeSort(a);
		}
	}
	//一次归并
	public static void merge(int []x,int []y,int b1,int b2,int n){
		int i=b1,j=b2,k=b1;
		while(i<b1+n&&j<b2+n&&j<x.length){
			if(x[i]<=x[j])
				y[k++]=x[i++];
			else
				y[k++]=x[j++];
		}
		while(i<b1+n&&i<x.length)
			y[k++]=x[i++];
		while(j<b2+n&&j<x.length)
			y[k++]=x[j++];
	}
	//一趟归并
	public static void mergepass(int x[],int y[],int n){
		for(int i=0;i<x.length;i+=2*n){
			merge(x,y,i,i+n,n); 
		}
	}
	//归并排序
	public static void mergeSort(int []x){
		int []y=new int[x.length];
		int n=1;
		//一次循环进行两次一趟归并,目的是将y复制到x中
		while(n<x.length){
			mergepass(x,y,n);
			n*=2;
			if(n<x.length){
				mergepass(y,x,n);
				n*=2;
			}
		}
		for(int i=0;i<x.length-1;i++){
			System.out.print(x[i]+" ");
		}
		System.out.println(x[x.length-1]);
	}
}

(2)递归法

import java.util.Scanner;

public class Main {
	static int x[];
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner  cin = new Scanner(System.in);
		while(cin.hasNext()){
			int n=cin.nextInt();
			x=new int[n];
			for(int i=0;i<n;i++){
				x[i]=cin.nextInt();
			}
			mergeDg(x,0,n-1);
			for(int i=0;i<x.length-1;i++){
				System.out.print(x[i]+" ");
			}
			System.out.println(x[x.length-1]);
		}
	}
	//一次归并
	public static void merge(int []x,int []y,int begin,int end,int n){
		int i=begin,j=n+1,k=begin;
		while(i<1+n&&j<=end&&j<x.length){
			if(x[i]<=x[j])
				y[k++]=x[i++];
			else
				y[k++]=x[j++];
		}
		while(i<n+1&&i<x.length)
			y[k++]=x[i++];
		while(j<=end&&j<x.length)
			y[k++]=x[j++];
		//将y复制到x
		for(int h=begin;h<=end;h++) {
			x[h]=y[h];
		}
	}
	//归并排序-----递归
	//二分法思路
	public static void mergeDg(int []x,int begin,int end){
		if(begin<end) {
			int []y=new int[x.length];
			int m=(begin+end)/2;
			mergeDg(x,begin,m);
			mergeDg(x,m+1,end);
			merge(x,y,begin,end,m);
		}
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值