美文网首页
归并排序存档【转】

归并排序存档【转】

作者: 编程小火鸡 | 来源:发表于2019-07-08 09:34 被阅读0次

归并算法(MERGE-SORT)(设按升序排列)
1、分冶法---分冶思想的介绍

将原始问题分解为几个规模较小但类似于原问题容易解决的子问题,递归地求解这些子问题,然后再合并子问题的解来建立原始问题的解。
分冶法在递归时的步骤

分解: 原问题分解为子问题,子问题是原问题规模较小的实例。
解决: 递归地解决子问题,若子问题足够小,则直接求解。
合并: 合并子问题的解。得到原问题解。

在归并排序中的体现

分解: 分解待排序的n个元素的序列成各自具有n/2个元素的两个子序列。
解决: 使用归并排序递归地排序两个子序列。
合并: 合并两个已排序的子序列一产生最终已排序的序列。

2、 归并排序伪代码描述

主过程: MERGE-SORT(A, startIndex, endIndex), A: 待排数组 startIndex: 起始数组下标 endIndex: 截止数组下标

MERGE-SORT(A, startIndex, endIndex)

    if startIndex < endIndex
        midIndex = (startIndex + endIndex)/2  // midIndex取(startIndex + endIndex)/2值的底;
        MERGE-SORT(A, startIndex ,midIndex)
        MERGE-SORT(A, midIndex + 1,endIndex)
        MERGE(A, startIndex, midIndex, endIndex)

子过程: MERGE(A, startIndex, midIndex, endIndex)

MERGE(A, startIndex, midIndex, endIndex)
    n1 = midindex - startIndex + 1
    n2 = endIndex - midIndex
    let L[1..n1+1] and R[1..n2+1] be new arrays
    
    for i = 1 to n1
        L[i] = A[startIndex + i -1]
        
    for j = 1 to n2
        R[j] = A[midIndex + j]
        
    L[n1+1] = Infinity
    R[n2+1] = Infinity
    i = 1
    j = 1
    
    for k = startIndex to endIndex
        if L[i] <= R[j]
            A[k] = L[i]
            i = i + 1
        else A[k] = R[j]
            j = j + 1

C#代码

static void Merge<T>(T[] arr, int left, int middle, int right) where T: IComparable<T>
{
    T[] leftArray = new T[middle - left + 1];
    T[] rightArray = new T[right - middle];

    Array.Copy(arr, left, leftArray, 0, middle - left + 1);
    Array.Copy(arr, middle + 1, rightArray, 0, right - middle);

    int i = 0;
    int j = 0;
    for (int k = left; k < right + 1; k++)
    {
        if (i == leftArray.Length)
        {
            arr[k] = rightArray[j];
            j++;
        }
        else if (j == rightArray.Length)
        {
            arr[k] = leftArray[i];
            i++;
        }
        else if (leftArray[i].CompareTo(rightArray[j]) <= 0)
        {
            arr[k] = leftArray[i];
            i++;
        }
        else
        {
            arr[k] = rightArray[j];
            j++;
        }
    }
}
static void MergeSort<T>(T[] arr, int left, int high) where T: IComparable<T>
{
    if (left< high)
    {
        int mid = (left + high) / 2;
        MergeSort(arr, left, mid);
        MergeSort(arr, mid + 1, high);
        Merge(arr, left, mid, high);
    }
}

相关文章

  • 归并排序存档【转】

    归并算法(MERGE-SORT)(设按升序排列)1、分冶法---分冶思想的介绍 将原始问题分解为几个规模较小但类似...

  • 常用排序算法总结

    大写的转 目录 [冒泡排序][鸡尾酒排序] [选择排序] [插入排序][二分插入排序][希尔排序] [归并排序] ...

  • 排序算法

    约定 选择排序 冒泡排序 插入排序 希尔排序 归并排序1. 归并方法2. 自顶向下归并排序3. 自底向上归并排序 ...

  • 排序二:归并、快排

    文章结构 归并排序 快速排序 源码 1. 归并排序 1.1 什么是归并排序 归并排序的思想是:将待排序的区间平分成...

  • java归并排序

    归并排序什么是归并排序:图解归并排序归并排序有两种实现方式,一是基于递归,而是基于迭代1)基于递归的归并排序: 基...

  • 算法—排序篇2

    1、归并排序(Merging Sort) 归并排序(Merging Sort): 就是利用归并的思想实现排序⽅法....

  • 常见的排序算法(2)

    要点 快速排序 归并排序 1.快速排序 2.归并排序

  • 转-归并排序

    基本思想 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-an...

  • 排序算法之归并排序

    归并排序(Merge Sort) 归并排序是利用归并的思想实现排序的方式,该算法采用的是经典的分治算法 归并排序过...

  • 算法 第二章第二部分笔记

    各种排序算法的性能特点 选择排序 插入排序 希尔排序 归并排序 本地归并排序 自底向上的归并排序 快速排序 三向切...

网友评论

      本文标题:归并排序存档【转】

      本文链接:https://www.haomeiwen.com/subject/oienhctx.html