排序算法——归并排序

步骤:1.递归拆分,并对两个拆分的数组进行排序

    2.合并两个有序数组


时间复杂度为O(nlogn)


原理图:



代码实现:

package suanfa;

public class Merge {
	private static int[] temp;
	public static void main(String[] args) {
		
		int[] a={1,7,8,9,2,3,4,5};
		Merge.sort(a, 0, a.length-1);
		for(int i=0;i<a.length;i++)
		{
			System.out.print(a[i]+",");
		}
	}
	
	static void sort( int[] a,int first,int last)
	{
		int mid=(last+first)/2; //以mid为中心 拆分两个数组
		if(last>first)  //递归条件
		{
			
			sort(a,first,mid);//排序左边数组
			sort(a,mid+1,last);//排序右边数组
			merge(a,first,mid,last);//合并两个数组
		}
			
		
	}
	static void merge(int[] a,int first,int mid,int last)
	{
		int[] temp=new int[a.length];//创建临时数组
		int i=first,j=mid+1;//定义左指针和右指针
		for(int k=first;k<=last;k++)
		{
			temp[k]=a[k];
		}
		for(int k=first;k<=last;k++)
		{
			if(i>mid)  
				a[k]=temp[j++];
			if(j>last)
				a[k]=temp[i++];
			else if(less(temp[i],temp[j]))
				a[k]=temp[i++];
			else a[k]=temp[j++];
		}
	}
	static boolean less(int a,int b)
	{
		return a<b;
	}
	static void exch(int[] a,int i,int j){
		int temp=a[i];
		a[i]=a[j];
		a[j]=temp;
	}
}

java代码:

package com.casm.leetcode;


public class Solution {
    public static void main(String[] args) {
		Solution test=new Solution();
		int[] num = new int[] {100,4,200,1,3,2,43,28,41,33};
		int[] temp = new int[num.length]; 
		test.Mergesort(num, temp, 0, num.length-1);
		for(int i=0;i<num.length;i++)
		{
			System.out.println(num[i]);
		}
		
		
	}
	public void Mergesort (int[] num, int temp[],int left, int right) {
		int mid;
		if(left<right)
		{
			mid=(right+left)/2;
			Mergesort(num, temp, left, mid);
			Mergesort(num, temp, mid+1, right);
			Merge(num, temp, left, mid, right);
		}
    }
	public void Merge(int[] num, int temp[],int left, int mid, int right) {
		int i,j,pos,leftend;
		i=left;
		leftend=mid;
		j=mid+1;
		pos=left;
		while(i<=leftend&&j<=right)
		{
			if(num[i]<num[j])
			{
				temp[pos++]=num[i++];
			}
			else
			{
				temp[pos++]=num[j++];
			}
		}
		while(i<=leftend)
		{
			temp[pos++]=num[i++];
		}
		while(j<=right)
		{
			temp[pos++]=num[j++];
		}
		for(int k=left;k<=right;k++)
		{
			num[k]=temp[k];
		}
	}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值