归并排序(java实现)

归并排序基本思想:将待排序的序列看成n个长度为1的表,两两合并,得到长度为2的有序序列,再对这些子序列进行合并,得到长度为4的有序序列...重复上述过程,直到最后一个子序列长度为n即可。

package SortRank;

/**
 * 归并排序:两两合并数组
 * 分两种:递归+迭代
 * @author 18322
 *
 */

public class MergeSort {
	public static void main(String[] args) {
		int arr[] = {87,45,78,32,17,65,53,9,122,133};
		MergeSort ms = new MergeSort();
		System.out.println("数组排序前的顺序:");
		ms.printArray(arr);
		ms.sort(arr);
		System.out.println("数组最终排序的顺序:");
		ms.printArray(arr);
	}
	
	private void sort(int[] arr) {
		sortRecursion(arr, 0 ,arr.length-1);
	}
	
//递归方式
	private void sortRecursion(int[] arr, int left, int right) {
		if(left == right) return;
		int middle = left + (right - left) / 2;
		sortRecursion(arr, left, middle);
		sortRecursion(arr, middle+1, right);
		mergeArr(arr, left, middle, right);
	}
	
	private void mergeArr(int[] arr, int left, int middle, int right) {
		int[] num = new int[right-left+1];
		int i = left;
		int j = middle + 1;
		int k = 0;
		while(i <= middle && j <= right) {
			num[k++] = arr[i] < arr[j] ? arr[i++] : arr[j++];
		}
		
		while(i <= middle) {
			num[k++] = arr[i++];
		}
		
		while(j <= right) {
			num[k++] = arr[j++];
		}
		int index = 0;
		while(left <= right) {
			arr[left++] = num[index++];
		}
	}
	
	private void printArray(int arr[]) {
		for(int in : arr) {
			System.out.print(in + "\t");
		}
		System.out.println();
	}
	

//迭代方式
	/*private void sort(int[] arr) {
		int len = 1;   //长度
		while(len < arr.length) {
			for(int i = 0; i < arr.length; i += 2*len) {
				sortIterator(arr, i, len);
			}
			System.out.println("长度为" + len + "时数组的顺序:");
			printArray(arr);
			len *= 2;
		}
	}
	
	private void sortIterator(int[] arr, int start, int len) {
		int[] num = new int[len+len];
		int i = start;
		int j = start + len;
		int k = 0;
		while(i < start+len && (j < start+len+len && j < arr.length)) {
			num[k++] = arr[i]<arr[j] ? arr[i++] : arr[j++];
		}
		while(i < start+len && i < arr.length) {
			num[k++] = arr[i++];
		}
		
		while(j < start+len+len && j < arr.length) {
			num[k++] = arr[j++];
		}
		int index = 0;
		int right = start + len + len;
		while(start < arr.length && start < right) {
			arr[start++] = num[index++];
		}
	}**/
}

猜你喜欢

转载自blog.csdn.net/buer219/article/details/89418095