• 归并排序



    1.问题划分
    2.递归求解
    3合并问题

    import java.util.Arrays;
    import java.util.Random;
    public class Main{	
    
    	public static void isSort(int[] arr){
    		for(int i=0,j=1;j<arr.length;i++,j++){
    			if(arr[i]>arr[j]){
    				System.out.println("排序失败");
    				System.out.print(Arrays.toString(arr));
    				return;
    			}
    		}
    		System.out.println("排序成功");
    		System.out.print(Arrays.toString(arr));
    	}
    	private static void merge(int[] arr,int[] aux,int left,int mid,int right){
    		for(int k=left;k<=right;k++){
    			aux[k]=arr[k];
    		}
    		int i=left;
    		int j=mid+1;
    		for(int k=left;k<=right;k++){
    			if(i>mid) arr[k]=aux[j++];
    			else if(j>right) arr[k]=aux[i++];
    			else if(aux[j]<aux[i]) arr[k]=aux[j++];
    			else arr[k]=aux[i++];
    			
    		}
    	}
    	public static void sort(int[] arr,int [] aux,int left,int right){
    		if(left>=right) return;
    		int mid=left+(right-left)/2;
    		sort(arr,aux,left,mid);
    		sort(arr,aux,mid+1,right);
    		merge(arr,aux,left,mid,right);
    	}
    	public static void main(String[] args){
    		Random random=new Random();
    		int[] arr=new int[10000000];
    		int[] aux=new int[10000000];
    		for(int i=0;i<10000;i++){
    			arr[i]=random.nextInt(10000);
    		}
    		sort(arr,aux,0,arr.length-1);
    		isSort(arr);
    	}
    }

     利用归并求逆序对

    	public static int merge_and_count(int[] arr,int[] aux,int lo,int mid,int hi){
    		int k=hi;
    		int i=mid;
    		int j=hi;
    		int count=0;
    		while(i>=lo&&j>mid){
    			if(arr[i]>arr[j]){
    				count+=j-mid;
    				aux[k--]=arr[i--];
    			}else{
    				aux[k--]=arr[j--];
    			}
    		}
    		while(i>=lo){
    			aux[k--]=arr[i--];
    		}
    		while(j>mid){
    			aux[k--]=arr[j--];
    		}
    		for(int r=lo;r<=hi;r++){
    			arr[r]=aux[r];
    		}
    		return count;
    	}
    	public static int sort(int[] arr,int aux[],int lo,int hi){
    		if(lo>=hi) return 0;
    		int count=0;
    		int mid=lo+(hi-lo)/2;
    		count+=sort(arr,aux,lo,mid);
    		count+=sort(arr,aux,mid+1,hi);
    		count+=merge_and_count(arr,aux,lo,mid,hi);
    		return count;
    	}
    

      

  • 相关阅读:
    DirectShow自带实例StillCap在回调函数里实现抓图并保存为文件
    x264 VS2008下编译成功
    yuy2_to_i420,yuyv_to_i420
    x264源码阅读
    oracle 归档日志开启、关闭及删除归档日志
    TOMCAT设置JVM
    linux root 操作oracle命令
    struts2 标签判断list是否为空
    linux下mysql 5.5配置
    RHEL 6 下VNC Server 的安装配置
  • 原文地址:https://www.cnblogs.com/wqkant/p/6709326.html
Copyright © 2020-2023  润新知