zoukankan      html  css  js  c++  java
  • 排序08归并排序

    一)定义

    归并排序 (merge sort) 是一类与插入排序、交换排序、选择排序不同的另一种排序方法。归并的含义是将两个或两个以上的有序表合并成一个新的有序表。归并排序有多路归并排序、两路归并排序 , 可用于内排序,也可以用于外排序。

     

    二)归并排序实现——两路归并(java)

    package com.fox;
    
    import java.util.Random;
    
    /**
     * @author huangfox
     * @serial 合并排序
     */
    public class MergeSort {
    
    	public static void sort(int[] seq) {
    		mergeSort(seq, 0, seq.length - 1);
    	}
    
    	/**
    	 * 分治,采用
    	 * 
    	 * @param seq
    	 * @param s
    	 * @param e
    	 */
    	public static void mergeSort(int[] seq, int s, int e) {
    		if (s < e) {
    			int m = (s + e) / 2;
    			mergeSort(seq, s, m);
    			mergeSort(seq, m + 1, e);
    			merge(seq, s, m, e);
    		}
    	}
    
    	private static void merge(int[] seq, int s, int m, int e) {
    		int n1 = m - s + 1;
    		int n2 = e - m;
    		int[] ls = new int[n1];
    		for (int i = 0; i < ls.length; i++) {
    			ls[i] = seq[s + i];
    		}
    		int[] rs = new int[n2];
    		for (int i = 0; i < rs.length; i++) {
    			rs[i] = seq[m + i + 1];
    		}
    		int index = s;
    		int i1 = 0;
    		int i2 = 0;
    		while (i1 < n1 && i2 < n2) {
    			if (ls[i1] < rs[i2]) {
    				seq[index++] = ls[i1++];
    			} else {
    				seq[index++] = rs[i2++];
    			}
    		}
    		while (i1 < n1) {
    			seq[index++] = ls[i1++];
    		}
    		while (i2 < n2) {
    			seq[index++] = rs[i2++];
    		}
    	}
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		int[] a = new int[100000];
    		Random random = new Random();
    		for (int i = 0; i < a.length; i++) {
    			a[i] = random.nextInt(100000);
    		}
    //		a = new int[] { 6, 7, 51, 2, 52, 8 };
    		long bt = System.currentTimeMillis();
    		MergeSort.sort(a);
    		System.out.println(System.currentTimeMillis() - bt);
    		 for (int a_ : a)
    		 System.out.println(a_);
    
    	}
    
    }
    

    归并排序——需要一个辅助向量来暂存两有序子文件归并的结果,故其辅助空间复杂度为O(n),显然它不是就地排序。

  • 相关阅读:
    Spring MVC全局异常后返回JSON异常数据
    spring mvc 异常统一处理方式
    Duplicate fragment name ERROR Jetty Maven Plugin
    Android中自己定义组件和它的属性
    stl非变易算法(二)
    unix more命令
    g711u与g729比較编码格式
    MD5的加密和解密(总结)
    js 定义类对象
    润乾报表实现可反复分组报表及改进
  • 原文地址:https://www.cnblogs.com/huangfox/p/2571422.html
Copyright © 2011-2022 走看看