今晚我就跟排序耗上了,再来个归并

归并在学数组合并的时候学了一次,链表合并时又学了一次,在加上数据结构中学了一次,算法中一次。OMG,排序中还要学一次……在记不住就没天理人性了啊。

public class MergeSort {
	private int[] paraL;
	private int[] paraSL;//排序好的list
	
	public MergeSort(){}
	public void show(){
		paraL = paraSL;
		System.out.println("排序后的记录为:");
		for(int para:paraL){
			System.out.print(para+"    ");
		}
		System.out.println();
	}
	public void merge(int s,int m,int e){//将paraL中的s至m,m+1至e链表合并到paraSL
		int ss = s;
		int i = s;
		int mm = m+1;
		/*s是s至m的指针,mm是m至e的指针,ss是paraSL的指针*/
		while(s <= m && mm <= e){//s和e处都能取到值
			if(paraL[s]<paraL[mm]){//将小的插入到paraSL
				paraSL[ss++] = paraL[s++];
			}else{
				paraSL[ss++] = paraL[mm++];
			}
		}
		while(s <= m){//将s至m段剩余部分插入paraSL
			paraSL[ss++] = paraL[s++];
		}
		while(mm <= e){//将m+1至e段剩余部分插入paraSL
			paraSL[ss++] = paraL[mm++];
		}
		/*<span style="color:#ff0000;">在副本里排好序之后需要拷回原数组,这一点最为重要</span>*/
		for(;i <= e ; i++){
			paraL[i] = paraSL[i];
		}
	}
	public void mSort(int s,int e){
		if(s==e){
			paraSL[s] = paraL[s];
		}else{
			int m = (s+e)/2;
			mSort(s,m);
			mSort(m+1,e);
			merge(s,m,e);
		}
	}
	
	public static void main(String[] args){
		int[] paraL = {9,8,7,6,5,4,3,2,1};
		MergeSort ms = new MergeSort();
		ms.setParaL(paraL);
		ms.mSort(0,paraL.length-1);
		ms.show();
	}
	
	public int[] getParaL() {
		return paraL;
	}
	public void setParaL(int[] paraL) {
		this.paraL = paraL;
		paraSL = new int[this.paraL.length];
	}
}

20160803再次实现

/**
 * ClassName: MergeSort 
 * @Description: 归并排序:分治法的应用,把链表分成两部分,两部分分别递归进行排序,然后将两部分合并。
 * @author Panyk
 * @date 2016年8月3日
 */
public class MergeSort {
	public int[] data;
	private int[] tempD;
	
	public MergeSort(int[] data) {
		this.data = data;
		tempD = new int[data.length];
	}
	/**
	 * @Description:对start至end的元素进行排序,包括start和end 
	 * @param @param start
	 * @param @param end   
	 * @return void  
	 * @throws
	 * @author Panyk
	 * @date 2016年8月3日
	 */
	public void sort(int start, int end){
		if(start >= end){
			return;
		}
		int middle = (start + end)/2;
		sort(start, middle);
		sort(middle + 1, end);//因为前面已经处理middle了,所以这里需要从middle+1开始处理
		merge(start, middle, end);//将上面已经排好序的两段进行合并
		show();
	}
	/**
	 * @Description:合并逻辑上的两个链表 
	 * @param @param start
	 * @param @param middle
	 * @param @param end   
	 * @return void  
	 * @throws
	 * @author Panyk
	 * @date 2016年8月3日
	 */
	private void merge(int start, int middle, int end){
		int i = start;
		int j = middle+1;
		int k = start;
		while(i<=middle && j<=end){
			if(data[i]<data[j]){
				tempD[k++] = data[i++];
			}else{
				tempD[k++] = data[j++];
			}
		}
		while(i<=middle){
			tempD[k++] = data[i++];
		}
		while(j<=end){
			tempD[k++] = data[j++];
		}
		i = start;
		while(i <= end){//把合并后的数据拷贝到原始数组
			data[i] = tempD[i];
			i++;
		}
	}

	private void show(){
        for(int temp: data){  
            System.out.print("  " + temp);  
        }  
        System.out.println();  
    }
	
	public static void main(String[] args) {
//		int[] data = new int[]{1,  3,  5,  2,  4,  4,  1,  2};
		int[] data = {9,8,7,6,5,4,3,2,1};
		MergeSort qs = new MergeSort(data);
		qs.sort(0, data.length-1);
	}
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值