分治法,归并排序

来源:互联网 发布:星际争霸2 免费知乎 编辑:程序博客网 时间:2024/04/28 13:58

1.时间复杂度为O(nlog(n)),

非降序

代码:

package com.cn.insertion;/** * 归并排序,采用分治法的策略 * @author Administrator * */public class Merge_Sort {public static void main(String[] args) {int[] a = new int[]{10, 9, 8, 6, 7, 5, 4, 3, 2, 1};mergeSort(a, 0, 9);for (int i = 0; i < a.length; i++) {System.out.println(a[i]);}}/** * 先分在和,逐层递归 * @param a * @param p * @param r */public static void mergeSort(int[] a, int p, int r) {if (p < r) {int q = (p + r)/2;mergeSort(a, p, q);mergeSort(a,q + 1, r);merge(a, p, q, r);}}/** * 归并函数 * @param a * @param p * @param q * @param r */public static void merge(int[] a, int p, int q, int r) {//用另外两个数组来保存前面与后面的两段int n1 = q - p + 1;int n2 = r - q;int[] m = new int[n1 + 1];int[] n = new int[n2 + 1];//保存p--q段for (int i = 0; i < m.length - 1; i++) {m[i] = a[p + i];}m[n1] = Integer.MAX_VALUE;//哨兵牌//保存q--r段for (int i = 0; i < n.length - 1; i++) {n[i] = a[q + i + 1];}n[n2] = Integer.MAX_VALUE;//哨兵牌int i = 0, j = 0;//归并的过程,每次去小的那一个,i, j让两个数组一只往后走for (int k = p; k <= r; k++) {if (m[i] < n[j]) {a[k] = m[i];i++;}else {a[k] = n[j];j++;}}}}