归并排序——最省时的排序

/*
因为归并排序至于O(n)的复杂度所以省时
*/
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<string>
#include<algorithm>
#include<vector>
#include<map>

#define N 100010
#define MAXN 100010

using namespace std;

//将有二个有序数列a[first...mid]和a[mid...last]合并。
void mergearray(int a[], int first, int mid, int last, int temp[])
{
    int i = first, j = mid + 1;
    int m = mid,   n = last;
    int k = 0;
    while (i <= m && j <= n)
    {
        if (a[i] <= a[j])
            temp[k++] = a[i++];
        else
            temp[k++] = a[j++];
    }

    while (i <= m)
        temp[k++] = a[i++];

    while (j <= n)
        temp[k++] = a[j++];

    for (i = 0; i < k; i++)
        a[first + i] = temp[i];
}
void mergesort(int a[], int first, int last, int temp[])
{
    if (first < last)
    {
        int mid = (first + last) / 2;
        mergesort(a, first, mid, temp);    //左边有序
        mergesort(a, mid + 1, last, temp); //右边有序
        mergearray(a, first, mid, last, temp); //再将二个有序数列合并
    }
}

bool MergeSort(int a[], int n)
{
    int *p = new int[n];
    if (p == NULL)
        return false;
    mergesort(a, 0, n - 1, p);
    delete[] p;
    return true;
}

int main()
{
    //freopen("C:\\Users\\acer\\Desktop\\in.txt","r",stdin);
    int cur1[]={1,4,7,8,5,2,3,6,9,0};
    int cur2[12];
    mergesort(cur1, 0, 9, cur2);
    for(int i=0;i<10;i++)
        cout<<cur2[i]<<" ";
    cout<<endl;

    return 0;
}
时间: 2024-11-05 04:49:38

归并排序——最省时的排序的相关文章

算法—归并排序的改进及排序算法的极致

1.对小规模子数组使用插入排序 用不同的方法处理小规模问题能改进大多数递归算法的性能,因为递归会使小规模问题中方法的调用过于频繁,所以改进对它们的处理方法就能改进整个算法.对排序来说,我们已经知道插入排序(或者选择排序)非常简单,因此很可能在小数组上比归并排序更快.和之前一样,一幅可视轨迹图能够很好地说明归并排序的行为方式.图中的可视轨迹图显示的是改良后的归并排序的所有操作.使用插入排序处理小规模的子数组(比如长度小于15)一般可以将归并排序的运行时间缩短10%~15%. 2.测试数组是否已经有

二路归并排序(也叫合并排序)

下面这图展示了二路归并的过程 二路归并的核心代码是merge()函数 它将2个分割的数组有序的合并在一起 如图: 在数组A中, 从p到q是一个数组,从q到r是另外一个数组 那么如何将这2个数组有序的合并在一起,组个新的数组A呢? 步骤: 第一步:开辟一个数组L,存放p到q之间(也就是需要归并的左边数组)的元素 第二部:开辟一个数组R,存放q到r之间(也就是需要归并的右边数组)的元素 第三步:2个数组的最后还要加一个无穷大的数(可以用0x7FFF表示),因此开辟的数组空间要多1字符个空间 第四步:

算法导论 分治法+归并排序的一种排序算法 C++实现

#include<iostream> #include <time.h> using namespace std; void merge(int*A, int p, int q, int r) { int i = 0; int index1 = 0; int index2 = 0; int length1 = q - p + 1; int length2 = r - q; int* arr1=new int[length1+1]; int* arr2 = new int[lengt

自写归并排序和调用系统排序方法,C++

#include<iostream>#include<stdlib.h>#include<malloc.h>#include<algorithm> #include<ctime>#define length 10using namespace std;bool compare(int a, int b){ return a > b;}void mergeSorted(int *array, int start, int end);int m

算法 排序NB二人组 堆排序 归并排序

参考博客:基于python的七种经典排序算法     常用排序算法总结(一) 序前传 - 树与二叉树 树是一种很常见的非线性的数据结构,称为树形结构,简称树.所谓数据结构就是一组数据的集合连同它们的储存关系和对它们的操作方法.树形结构就像自然界的一颗树的构造一样,有一个根和若干个树枝和树叶.根或主干是第一层的,从主干长出的分枝是第二层的,一层一层直到最后,末端的没有分支的结点叫做叶子,所以树形结构是一个层次结构.在<数据结构>中,则用人类的血统关系来命名,一个结点的分枝叫做该结点的"

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

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

排序算法(四)——归并排序与递归

基本思想 分析归并排序之前,我们先来了解一下分治算法. 分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同.求出子问题的解,就可得到原问题的解. 分治算法的一般步骤: (1)分解,将要解决的问题划分成若干规模较小的同类问题: (2)求解,当子问题划分得足够小时,用较简单的方法解决: (3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解. 归并排序是分治算法的典型应用. 归并排序先将一个无序的N长数组切成N个有序子序列(只有一个数据的

排序算法之归并排序(Mergesort)解析

一.归并排序的优缺点(pros and cons) 耗费心思来理解它,总要有个理由吧: 归并排序的效率达到了巅峰:时间复杂度为O(nlogn),这是基于比较的排序算法所能达到的最高境界 归并排序是一种稳定的算法(即在排序过程中大小相同的元素能够保持排序前的顺序,3212升序排序结果是1223,排序前后两个2的顺序不变),这一点在某些场景下至关重要 归并排序是最常用的外部排序方法(当待排序的记录放在外存上,内存装不下全部数据时,归并排序仍然适用,当然归并排序同样适用于内部排序...) 缺点: 归并

排序算法总结之归并排序

基本思想 设归并排序的当前区间是R[low..high],分治法的三个步骤是: ①分解:将当前区间一分为二,即求分裂点 ②求解:递归地对两个子区间R[low..mid]和R[mid+1..high]进行归并排序: ③组合:将已排序的两个子区间R[low..mid]和R[mid+1..high]归并为一个有序的区间R[low..high]. 递归的终结条件:子区间长度为1(一个记录自然有序). 将两个有序序列合并成一个新的有序序列. ①把 n 个记录看成 n 个长度为 1的有序子表: ②进行两两归