排序--MergeSort 归并排序?

  MergeSort ‘s implementation

  MergetSort 的中心思想就是分治思想,通过解决每一个小问题来解决大问题

  假设你有2个已经排好序的数组

  数组[ 4 ][ 8 ] 和 数组[ 5 ][ 7 ] 进行排序

  4 是第一个数组最小的值  和 第二个数组最小的值5 进行比较 4 < 5 所以最小的元素是4

  排完第一个元素后是[ 4 ][ null ][ null ][ null ]

  接着排第二个元素, 8 和 5 比较。5 比较小

  所以是 [ 4 ][ 5 ][ null ][ null ],接着 第一个数组最小的值8 和第二个数组最好的值7 比较。 7  < 8

  所以变成 [ 4 ][ 5 ][ 7 ][ 8 ]。

  所以问题的关键就是先把2个 数组分别排序了。再merge到一个大的数组中。下面盗用一下别人的图。嘎嘎嘎

    

  mergeSort的复杂度为NLgN。相当快的算法。并且是stable

  下面给出具体的实现

  

    //Time : N log(N) & wasting space that proportional to N
    public static void sort(Comparable[] a) {
        sort(a, new Comparable[a.length], 0, a.length - 1);
    }

    //mid 的左右都已经是有序的了,
    //这个是merge方法
    //a 和辅助 数组的长度需要一致
    /**            i            j
      *             []  []  []  [ ]  []
     *             low     mid    hi
     */
    private static void sort(Comparable[] a, Comparable[] aux, int low, int hi) {
        if (low >= hi) return;
        int middle = low + (hi - low) / 2;
        sort(a, aux, low, middle); //sort left
        sort(a, aux, middle + 1, hi); // sort right
        merge(a, aux, low, middle, hi);
    }

    /**            i              j
      *            [ ]  [ ]  [ ]  [ ]  [ ]
     *            low       mid        hi
     */
    private static void merge(Comparable[] a, Comparable[] aux,int low, int middle, int hi) {
        int i = low;
        int j = middle + 1;
        for (int k = low; k <= hi; k++)
            aux[k] = a[k];   //把元素复制到辅助数组上

        for (int k = low; k <= hi; k++) {

            //前面2个判断条件一定要在前面。
            //要不然下面比较的时候 会出现空指针异常
            //因为已经有可能j 已经超出了hi的大小
            if (i > middle) a[k] = aux[j++];
            else if (j > hi) a[k] = aux[i++];
            else if (less(aux[i],aux[j])) a[k] = aux[i++]; //
            else a[k] = aux[j++];
        }
    }

merge sort

https://github.com/Cheemion/algorithms/blob/master/src/com/algorithms/sort/MergeSort.java

时间: 2024-11-05 06:11:35

排序--MergeSort 归并排序?的相关文章

单链表的排序 快速排序 归并排序 quicksort mergesort

原理都很简单,关键是某些边界能否正确写对: #include<iostream> #include<stdio.h> using namespace std; class Node { public: int val; Node* next; Node(int val = 0):val(val),next(NULL){ } }; Node* quicksort(Node* head, Node* tail) { Node *res1 = NULL, *res2 = NULL; No

“《算法》第4版第2章‘排序’”:归并排序

归并排序(Merge Sort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 归并操作(Merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作.归并排序算法依赖归并操作.归并排序有多路归并排序.两路归并排序 , 可用于内排序,也可以用于外排序.这里仅对内排序的两路归并方法进行讨论. 归并排序的步骤如下: 1)Divide: 将待排序序列(原问题)分成两个规模大致相等的子序列(子问题

排序算法——归并排序

归并排序是分治法的典型举例. 分治法的思想是,将原有问题分解为几个规模较小但类似于原问题的子问题,递归的求解这些子问题,然后再合并这些子问题的解来建立原问题的解. 分治模式在每层递归时都有三个步骤: 分解原问题为若干子问题,这些子问题是原问题的规模较小的实例. 解决这些子问题,递归地求解各子问题.然而,若子问题的规模足够小,则直接求解. 合并这些子问题的解成原问题的解. 归并排序算法完全遵循分治模式.直观上其操作如下: 分解:分解待排序的n个元素的序列成各具n/2个元素的两个子序列. 解决:使用

处理海量数据的三大排序之——归并排序(C++)

代码实现                                                                                                                                                                                   #include "stdafx.h" #include <iostream> #include <cti

C# 插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序

以下列出了数据结构与算法的八种基本排序:插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序,然后是測试的样例.代码位置:http://download.csdn.net/detail/luozuolincool/8040027 排序类: public class Sortings { //插入排序 public void insertSort(int[] array) { int temp = 0; int index = 0; for (int i = 0; i <

排序算法-归并排序(Java)

package com.rao.sort; import java.util.Arrays; /** * @author Srao * @className MergeSort * @date 2019/12/7 10:24 * @package com.rao.sort * @Description 归并排序 */public class MergeSort { /** * 归并排序:递归写法 * @param arr:要排序的数组 * @param left:数组最左边的元素的下标 * @p

排序(6)---------归并排序(C语言实现)

归并排序: 归并操作,也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作.归并排序算法依赖归并操作. 归并操作的过程如下: (1) 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 (2) 设定两个指针,最初位置分别为两个已经排序序列的起始位置 (3) 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置 (4) 重复步骤3直到某一指针到达序列尾 (5) 将另一序列剩下的所有元素直接复制(抄)到合并序列尾 简单的说,就是将一个序列不断的进行

经典排序算法 - 归并排序Merge sort

经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到所有合并完,形成有序的数组 举例 无序数组[6 2 4 1 5 9] 先看一下每一个步骤下的状态,完了再看合并细节 第一步 [6 2 4 1 5 9]原始状态 第二步 [2 6] [1 4] [5 9]两两合并排序,排序细节后边介绍 第三步 [1 2 4 6] [5 9]继续两组两组合并 第四步 [1 2 4 5 6 9]合并完成,排序完成 输出结

阿布学排序之归并排序

// test_max.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <cv.h> #include <highgui.h> #include <ml.h> #include <cxcore.h> #include <iostream> using namespace std; int main() { // step 1: //训练数据的分类标记,即4类 float