• 排序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),显然它不是就地排序。

  • 相关阅读:
    抓包工具 Fiddler 使用介绍
    HTTP 协议常见首部字段
    HTTP 协议服务器相关概念
    HTTP 协议常见的状态码
    HTTP 协议中 GET 和 POST 方法详解
    设置html title标题左侧的小图标
    HTML页面如何判断是手机访问还是电脑访问
    使用Java的Frame类编写的QQ登录界面
    swing中JTable的使用方法
    采用MVC模式JDBC演示案例
  • 原文地址:https://www.cnblogs.com/huangfox/p/2571422.html
Copyright © 2020-2023  润新知