分治:合并排序的java程序实现

合并排序:


采用分治策略将待排序的元素分成大小大致相同的两个子集合,先对两个子集合进行排序,将排序好的子集合合并成排好序的集合。

其算法是复杂度T(n)=O(nlogn)

合并排序主要中主要是在merge()这个方法中进行了排序。mergesort()仅仅是对数组进行的划分。

import java.util.Arrays;
import java.util.Scanner;

public class MergeSort {

	/**
	 * 合并排序
	 * 分治策略
	 * 将待排序的元素分成大小大致相同的两个子集合,先对两个子集合进行排序,将排序好的子集合合并成排好序的集合
	 * 复杂度T(n)=O(nlogn)
	 */
	public static void mergesort(int[] a, int left, int right) {

		// int b[]=new int[right-left+1];
		int i = (left + right) / 2;
		if (left < right) {

			mergesort(a, left, i);// 左边排序

			mergesort(a, i + 1, right);// 右边排序

			merge(a, left, i, right); // 合并排序并赋给原来的数组a
			// copy(a,left,right);

		}
	}

	public static void merge(int a[], int left, int i, int right) {
		int k = 0;
		int m = i + 1; // 右指针
		int n = left; // 左指针
		int b[] = new int[right - left + 1];

		while (n <= i && right >= m) {
			if (a[n] < a[m]) {
				b[k++] = a[n++];

			} else {
				b[k++] = a[m++];

			}
		}

		while (n <= i) { // 把左边数组剩余的数值放入数组b中
			b[k++] = a[n++];

		}
		while (m <= right) { // 把右边数组剩余的数值放入数组b中
			b[k++] = a[m++];

		}

		for (int j = 0; j < b.length; j++) { // 把b中的数组存入a中
			a[j + left] = b[j]; // 这里的left值不是n的值

		}
		/*
		 * void copy(int a[],int b[],int left,int right){ int j=0;
		 * for(j=0;j<right-left+1;j++){ a[j+left]=b[j]; }
		 */
	}

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);

		System.out.print("输入数组的长度:");
		int n = in.nextInt();
		int a[] = new int[n];
		for (int i = 0; i < n; i++) {
			System.out.print("输入第" + (i + 1) + "个数");
			a[i] = in.nextInt();
		}
		
		// MergeSort ms=new MergeSort();
		// ms.mergesort(a, 0, a.length-1);
		MergeSort.mergesort(a, 0, n-1);
		System.out.println("排序结果是:");
		System.out.println(Arrays.toString(a));  //输出数组a

	}

}
点赞