• 排序总结[5]_归并排序


    归并排序是典型的分治策略。

    • 归并操作:是合并两个已经排序的表,其思路是,设定两个指针p1和p2分别指向两个表,再新建一个临时数组,然后比较p2和p1把小的放进临时数组中,且对应的指针右移,重复此过程直到移动完成。
    • 归并排序定义:如果N=1,那么只有一个元素需要排列,答案是显而易见的,否则递归的将前半部分和后半部分分别进行归并排序,得到排序后的数组,使用上面描述的归并操作进行合并即可。
    void mergeort(int[] arr){
    	if(arr==null)throw new NullPointerException();
    	if(arr.length<=1)return;
    	int[] tmpArray = new int[arr.length];
    	mergeortCore(arr,0,arr.length-1,tmpArray);
    }
    void mergeortCore(int[] arr,int left,int right,int[] tmpArray){
    	//递归出口
    	if(left<right){
    		int center = left + ((right-left)>>>1);//notice
    		//1.分别对左右两部分递归排序
    		mergeortCore(arr,left,center,tmpArray);
    		mergeortCore(arr,center+1,right,tmpArray);
    		//2.然后合并左右两部分即可
    		int p1=left,p2=center+1;
    		int k=left;
    		while(p1<=center && p2<=right){
    			if(arr[p1]<=arr[p2]){
    				tmpArray[k++]=arr[p1++];
    			}else{
    				tmpArray[k++]=arr[p2++];
    			}
    		}
    		while(p1<=center)
    			tmpArray[k++]=arr[p1++];
    		while(p2<=right)
    			tmpArray[k++]=arr[p2++];
    		for(int i=right,k=right;i>=left;--i){//copy data back to arr
    			arr[i]=tmpArray[k--];
    		}
    	}
    }
    
  • 相关阅读:
    Innodb加载数据字典 && flush tables
    MySQL purge log简单吗
    MySQL ddl丢表
    数据库 一致性读&&当前读
    java数组
    customer.java
    java构造函数
    EXCEL 2007施工进度横道图制作步骤及实战练习
    如何利用office绘制施工进度计划横道图?
    计算器
  • 原文地址:https://www.cnblogs.com/lhyblog/p/5902573.html
Copyright © 2020-2023  润新知