【算法导论】第二章之归并排序

本文是《算法导论》第二章关于归并排序的详细讲解,作者周杰介绍了归并排序的基本原理、步骤及其实现方法。内容涵盖归并排序的递归算法设计,以及如何通过合并两个已排序的子数组来实现整体排序的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

By:                           周杰

Date:                       2012-12-16

Email:                     zhoujie338@126.com,sunwuwuzixu@gmail.com

Homepage:           http://blog.youkuaiyun.com/shuhuai007

Copyright:              该文章版权由周杰所有。可在非商业目的下任意传播和复制。

package com.zhoujie.charpter2;

import java.util.Random;

public class MergeSort {

	 public static final String LOG_PREFIX = "=========";  
	    public static final String ARR_DELIMITER = "\t";  
	  
	    public static final int ARRAY_LENGTH = 10;  
	    public static final int ARRAY_MAX_VALUE = 100;  
	  
	    public static void main(String[] args) {  
	        // 1. generate input array   
	        Random random = new Random();  
	  
	        int[] intArr = new int[ARRAY_LENGTH];  
	        printLine(LOG_PREFIX + "input arr is: ");  
	        for (int i = 0; i < intArr.length; i++) {  
	            intArr[i] = random.nextInt(ARRAY_MAX_VALUE);  
	            print(intArr[i]);  
	            if (i != intArr.length - 1) {  
	                print(ARR_DELIMITER);  
	            }  
	        }  
	        printLine("");  
	  
	        // 2. insert sort   
	        mergeSort(intArr);  
	  
	        // 3. print sorted array   
	        printLine(LOG_PREFIX + "output arr is: ");  
	        printLine(join(intArr, ARR_DELIMITER));  
	    }  
	  
	    public static void mergeSort(int [] intArr){
	    	mergeSort(intArr, 0, intArr.length-1);
	    }
	  
	    private static void mergeSort(int[] intArr, int p, int r) {
	    	if(p < r){
	    		int q = (p + r)/2;
	    		mergeSort(intArr, p, q);
	    		mergeSort(intArr, q+1, r);
	    		merge(intArr, p, q, r);
	    	}
		}

		private static void merge(int[] intArr, int p, int q, int r) {
			int leftLength = q - p + 1;
			int rightLength = r - q;
			int[] leftArr = new int[leftLength + 1];
			int[] rightArr = new int[rightLength + 1];
			for(int i = 0; i < leftLength; i ++){
				leftArr[i] = intArr[p + i];
			}
			leftArr[leftLength] = Integer.MAX_VALUE;
			for(int j = 0; j < rightLength; j ++){
				rightArr[j] = intArr[q + j + 1];
			}
			rightArr[rightLength] = Integer.MAX_VALUE;
			int i = 0;
			int j = 0;
			for(int k = p; k <= r; k ++){
				if(leftArr[i] <= rightArr[j]){
					intArr[k] = leftArr[i];
					i ++;
				} else {
					intArr[k] = rightArr[j];
					j ++;
				}
			}
		}

		public static void print(Object t) {  
	        System.out.print(t);  
	    }  
	  
	    public static void printLine(Object t) {  
	        System.out.println(t);  
	    }  
	  
	    public static String join(int[] arr, String delimiter) {  
	        StringBuilder sb = new StringBuilder();  
	        for (int element : arr) {  
	            sb.append(element);  
	            sb.append(delimiter);  
	        }  
	        return sb.substring(0, sb.length());  
	    }  


}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值