归并排序

Java实现归并排序

 1 package com.java;
 2 import java.util.Arrays;
 3 
 4 /**
 5  * 分治算法
 6  * 基本思路:
 7  * 对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,
 8  * 这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。
 9  * 具体步骤如下:
10  * 1、分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;
11  * 2、解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题;
12  * 3、合并:将各个子问题的解合并为原问题的解。
13  */
14 
15 /**
16  * 归并排序算法完全遵循分治模式,归并排序的基本操作如下:
17  * 1、分解:分解待排序的n个元素的序列成各具n/2个元素的两个子序列。
18  * 2、解决:使用归并排序递归地对两个子序列进行排序。
19  * 3、合并:合并两个已排序的子序列以产生已排序的答案。
20  */
21 
22 public class MergeSort {
23     public static void main(String[] args) {
24         int[] A = {15, 5, 3, 9, 4, 82, 35, 45, 7, 11};
25         System.out.println("原始数据: " + Arrays.toString(A));
26 
27         Merge_sort(A, 0, A.length - 1);
28         System.out.println("输出结果: " + Arrays.toString(A));
29     }
30 
31     public static void Merge_sort(int[] A, int p, int r) {
32         int q = (p + r) / 2;
33         if (p < r) {
34             //递归调用左分区
35             Merge_sort(A, p, q);
36             //递归调用右分区
37             Merge_sort(A, q + 1, r);
38             //归并排序数据元素
39             Merge(A, p, q, r);
40         }
41     }
42 
43     public static void Merge(int[] A, int p, int q, int r) {
44         int[] tmp = new int[r - p + 1];//声明一个临时数组,长度为要归并数组的长度
45         int i = p;   //记住左边数组第一个元素的下标
46         int j = q + 1; //记住右边数组第一个元素的下标
47         int k = 0;
48         while (i <= q && j <= r) {
49             //左边数组元素和右边数组元素比较,把小的元素赋给临时数组
50             if (A[i] <= A[j]) {
51                 tmp[k++] = A[i++];
52             } else {
53                 tmp[k++] = A[j++];
54             }
55         }
56         //把左边剩余的数组元素赋给临时数组
57         while (i <= q) {
58             tmp[k++] = A[i++];
59         }
60         //把右边剩余的数组元素赋给临时数组
61         while (j <= r) {
62             tmp[k++] = A[j++];
63         }
64         //用临时数组元素覆盖原数组元素
65         for (int k2 = 0; k2 < tmp.length; k2++) {
66             A[k2 + p] = tmp[k2];
67         }
68     }
69 }
原文地址:https://www.cnblogs.com/weijuanran/p/MergeSort.html