zoukankan      html  css  js  c++  java
  • 排序总结[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--];
    		}
    	}
    }
    
  • 相关阅读:
    bat学习
    Eclipse调试方法及快捷键
    JDK中的设计模式
    开源-自由-乔布斯
    AOP
    编程语言
    [LeetCode] 160. Intersection of Two Linked Lists(两个单链表的交集)
    [LeetCode] 198. House Robber(小偷)
    [LeetCode] 155. Min Stack(最小栈)
    [LeetCode] 1. Two Sum(两数之和)
  • 原文地址:https://www.cnblogs.com/lhyblog/p/5902573.html
Copyright © 2011-2022 走看看