Merge Sort Algorithm

来源:互联网 发布:广州软件开发工资 编辑:程序博客网 时间:2024/05/16 15:32

合并排序算法

给定整数数组,使用合并排序算法排序。

合并排序是一种有效的排序算法,可以产生稳定的排序,这意味着实现保留排序输出中相等元素的输入顺序。 Mergesort是一种比较排序,即它可以排序定义少于关系的任何类型的项目。合并排序最常见的实现不在原位排列。

Mergesort如何工作?

Mergesort是一个分裂和征服算法。像所有的分裂和征服算法一样,mergesort首先将一个大阵列划分成两个较小的子阵列,然后递归地对子阵列进行排序。基本上,整个过程涉及两个步骤 -

将未排序的数组划分为n个子数组,每个子数组包含1个元素(1个元素的数组被视为排序)。

重复合并子数组以生成新的排序子数组,直到只剩下1个子数组。这将是排序的数组。

下图显示了用于对7个整数数组进行排序的递归合并排序算法的自顶向下视图。

这里写图片描述

合并排序步骤

C ++

#include <bits / stdc ++。h>using namespace std;#define N 15//合并两个排序的子阵列arr [low .. mid]和arr [mid + 1 .. high]void Merge(int arr [],int aux [],int low,int mid,int high){    int k = low,i = low,j = mid + 1;    //左边和右边都有元素    while(i <= mid && j <= high)    {        if(arr [i] <arr [j])            aux [k ++] = arr [i ++];        其他            aux [k ++] = arr [j ++];    }    //复制剩余元素    而(i <= mid)        aux [k ++] = arr [i ++];    //不需要复制下半部分    //复制到原始数组以反映排序顺序    for(int i = low; i <= high; i ++)        arr [i] = aux [i];}//使用辅助阵列辅助排列数组arr [low..high]void MergeSort(int arr [],int aux [],int low,int high){    // 基本情况    if(high == low)// if run size == 1        返回;    //找到中点    int mid =(low +((high-low)>> 1));    //递归分裂运行到两半,直到运行大小为== 1,    //然后合并它们并返回回调链    MergeSort(arr,aux,low,mid); // split / merge left half    MergeSort(arr,aux,mid + 1,high); // split / merge right half    合并(arr,辅助,低,中,高);}//检查arr是否按升序排序的功能bool isSorted(int arr[]){    int prev = arr[0];    for (int i = 1; i < N; i++) {        if (prev > arr[i]) {            cout << "MergeSort Fails!!";            return false;        }        prev = arr[i];    }    return true;}// 主功能int main(){    int arr[N], aux[N];    srand(time(NULL));    //生成随机输入的整数    for (int i = 0; i < N; i++)        aux[i] = arr[i] = (rand() % 100) - 50;   //使用辅助阵列辅助排序数组arr    MergeSort(arr, aux, 0, N - 1);    if (isSorted(arr)) {        for (int i = 0; i < N; i++)            cout << arr[i] << " ";    }    return 0;}

输出:

-50 -41 -34 -23 -21 -11 5 9 10 19 26 33 35 40 49

性能:

合并排序的最差情况时间复杂度为O(nlogn)。复发关系是

T(n)= 2T(n / 2)+ cn = O(nlogn)

重复基本上总结了mergeesort - 排序原始列表的一半大小的两个列表,并添加了合并结果两个列表所需的n个步骤。

辅助空间为O(n)。

外部合并排序

原创粉丝点击