排序算法----归并排序

1. 什么是归并排序

归并排序就是将两个有序的数组并成一个更大的有序数组的递归排序算法。

2. 代码描述

一.自顶向下的归并排序

public class MergeSort 
{
	private static int[] x;
	public static void merge(int[] array,int start,int mid,int end)//在左右两边有序的情况下,进行原地归并
	{
		int i=start;
		int j=mid+1;
		for(int k=start;k<=end;k++)//将array[start..end]复制到x[start..end]中
		{
			x[k]=array[k];
		}
		for(int k=start;k<=end;k++)
		{
			if(i>mid)           array[k]=x[j++];//3.左半边用尽,取右半边的元素
			else if(j>end)      array[k]=x[i++];//4.右半边的元素用尽,取左半边的元素
			else if(x[j]<x[i])  array[k]=x[j++];//1.右半边的当前元素小于左半边的当前元素,取右半边的元素
			else                array[k]=x[i++];//2.右半边的当前元素大于或等于左半边的元素,取左半边的元素
		}
	}
	public static void sort(int[] array)
	{
		x=new int[array.length];
		sort(array,0,array.length-1);
	}
	public static void sort(int[] array,int start,int end)//重载一个sort方法,进行递归操作
	{
		if(end<=start)  return;
		//自顶向下进行递归,将数组分解到左右两边只剩下一个元素,然后直接原地归并
		int mid=start+(end-start)/2;
		sort(array,start,mid);
		sort(array,mid+1,end);
		merge(array,start,mid,end);
	}
	public static boolean isSorted(int[] array)//判断排序是否正确
	{
		for(int i=1;i<array.length;i++)
		{
			if(array[i]<array[i-1])
			{
				System.out.println("false");
				return false;//在排序有错时跳出循环
			}
		}
		System.out.println("排序结果正确,输出结果为:");
		return true;
	}
	public static void show(int[] array) //排序之后输出结果
	{
		for(int i=0;i<array.length;i++)
		{
			System.out.print(array[i]+"  ");
		}
	}
	public static void main(String[] args)
	{
		int[] array={5,13,3,7,4,16,18,11,2,3,9};
		sort(array);
		isSorted(array);
		show(array);
	}

}

二.自底向上

public static void sort(int[] array)
	{
		x=new int[array.length];
		for(int s=1;s<array.length;s=s+s)
		{
			for(int start=0;start<array.length-s;start+=s+s)
			{
				merge(array,start,start+s-1,Math.min(start+s+s-1, array.length-1));
			}
		}
	}

3. 算法特点

对于任意长度为N的数组,归并排序都需要1/2NlgN至NlgN次比较,最多访问数组6NlgN次

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值