合并排序

描述

给定输入排序元素数目n和相应的n个元素,写出程序,利用内排序算法中两路合并排序算法进行排序,并输出排序最后结果的相应序列。

输入

共两行,第一行给出排序元素数目n,第二行给出n个元素,1≤n≤100000,每个元素值范围为 [0,100000]

输出

一行,输出排序结果。

样例输入

7
48 36 68 72 12 48 2

样例输出

2 12 36 48 48 68 72

#include<stdio.h>
#include<malloc.h>
#define MaxSize 100

void Merge(int source[],int start1,int end1,int start2,int end2)
{
    int k=0;
    int i=start1;
    int j=start2;
    int m,n=0;
    int temp[100000];
    while(i<=end1&&j<=end2)
    {
        if(source[i]<=source[j])
            temp[k++]=source[i++];
        else
            temp[k++]=source[j++];
    }
    while(i<=end1)
    {
        temp[k++]=source[i++];
    }
    while(j<=end2)
    {
        temp[k++]=source[j++];
    }

    m=start1;
    for(;n<k;n++)
    {
        source[m++]=temp[n];
    }
}

void MergeSort(int source[],int start,int end)
{
    int mid;
    if(start<end)
    {
        mid=(start+end)/2;
        MergeSort(source,start,mid);
        MergeSort(source,mid+1,end);

        Merge(source,start,mid,mid+1,end);
    }

}

void main()
{
    int n,i=0;
    int source[100000];
    scanf("%d\n",&n);
    while(i<n)
    {
        scanf("%d",&source[i++]);
    }

    MergeSort(source,0,n-1);
    for(i=0;i<n-1;i++)
    {
        printf("%d ",source[i]);
    }
    printf("%d\n",source[n-1]);

}
时间: 2024-07-28 17:19:58

合并排序的相关文章

ACM ICPC 2011–2012, NEERC, Northern Subregional Contest J. John’s Inversions(合并排序求逆序数对数)

题目链接:http://codeforces.com/gym/100609/attachments 题目大意:有n张牌,每张牌有红色和蓝色两面,两面分别写了一些数字,同种颜色的任意两个数字若排在前面的数字比排在后面的数字大就叫做一对逆序数.求怎样排序得到的逆序数对最少. 解题思路:其中一种颜色的数字是顺序且这种颜色数字相同时对应的另一种颜色的数字是顺序时得到的逆序数对数最少.难点在于求逆序数对数.因为数量很大O(n^2)复杂度不能满足,这里根据合并排序的原理求解每个数字前面有多少个比它大的数字,

算法导论学习之插入排序+合并排序

最近准备花时间把算法导论详细的看一遍,强化一下算法和数据结构的基础,将一些总结性的东西写到博客上去. 一.插入排序 算法思想:如果一个数组A,从A[1–n-1]都是有序的,然后我们将A[n]插入到A[1–n-1]的某个合适的位置上去那么就可以保证A[1–n]都是有序的.这就是插入排序的思想:具体实现的时候我们将数组的第一个元素看出有序,然后从第二个元素开始按照上面的步骤进行插入操作,直到插入最后一个元素,然后整个数组都是有序的了. 时间复杂度分析:代码中有两重for循环,很容易看出时间复杂度是n

C言语合并排序(兼并排序)算法及代码

合并排序也称兼并排序,其算法思惟是将待排序序列分为两局部,顺次对分得的两个局部再次运用合并排序,之后再对其停止兼并.仅从算法思惟上理解合并排序会认为很笼统,接下来就以对序列A[0], A[l]-, A[n-1]停止升序陈列来停止解说,在此采取自顶向下的完成办法,操作步调如下.(1)将所要停止的排序序列分为阁下两个局部,假如要停止排序的序列的肇端元素下标为first,最初一个元素的下标为last,那么阁下两局部之间的临界点下标mid=(first+last)/2,这两局部辨别是A[first -

算法实验:分治法合并排序(C++)

这篇文章分两部分来写,第一部分写代码的实现过程,第二部分把实验报告从头到尾呈现出来. 我习惯调试使用的编译器是DEV C++,不是vs系列的,可能头文件上有点区别.但是下面的报告是我放到vs里面测试过的,可以直接用,不影响. 第一部分:(解析) 题目:随机产生一个整型数组,然后用合并排序将该数组做升序排列,要求输出排序前和排序后的数组. 题目分析: 需要随机产生一个整数数组: 采用的算法是合并排序,也就是用归并排序: 输出排序后的数组. 随机产生一个整数数组:这个问题首先想到的是用rand()函

改进版的合并排序

下面是改进版的合并排序,下面是jdk1.7的源码部分 执行步骤如下: (1)如果比较的长度小于INSERTIONSORT_THRESHOLD插入排序的阈值,直接调用传统的插入排序进行比较 (2)当大于插入排序的阈值时,采用合并排序算法,这里有个改进的地方,红色加亮部分,如果已经排好序的,不再进行比较,而是直接复制过去,提高效率 private static void mergeSort(Object[] src,                                  Object[]

分治——合并排序

分治策略中有一个经典的算法就是合并排序,这个算法的精髓也是分治二字,分而治之.将一个大规模的问题分割成若干个同样的小问题,小问题的规模很小,很容易解决,解决了小的问题后再对这些小问题的结果进行合并得到大规模问题的解答. 合并排序便是分治策略中比较经典的算法,首先是合并,两个排列有序的数列经过合并后成为有序的数组:代码如下: void _merge(int *A,int left,int middle,int right) { int i=left,j=middle+1,k=0; int *C;

【合并排序法】

/* 合并排序法 */ #include <stdio.h> #include <stdlib.h> #include <time.h> #define MAX1 10 #define MAX2 10 #define SWAP(x,y) {int t; t = x; x = y; y = t;} int partition(int[], int, int); void quicksort(int[], int, int); void mergesort(int[], i

Algorithm Road~合并排序

1 #include <iostream> 2 using namespace std; 3 /** 4 分治法: 5 合并排序最大的优点是它的时间复杂度为O(nlgn),这个是我们之前的选择排序和插入排序所达不到的. 6 他还是一种稳定性排序,也就是相等的元素在序列中的相对位置在排序前后不会发生变化. 7 他的唯一缺点是,需要利用额外的N的空间来进行排序. 8 9 实验步骤:: 10 申请空间,使其大小为两个已经排序序列之和,然后将待排序数组复制到该数组中. 11 设定两个指针,最初位置分别

实现真正意义上的合并排序

(算法老师布置这道题好长时间了,可是一直没有思路,真的是憋出来的代码啊) 真正意义上的合并排序是按照给的数组来判断的,它分的不是两两一组,在四四一组排序,直到完全排完序,真正意义上的合并排序是指 先在数组上找到已有序的数组,分成几块,在进行合并. 代码如下: #include <stdio.h>#define N 10#define flag1 1#define flag2 2int *FindOrder(int *a,int *b) //找到数组里有序的一段{ int i=0,j=0; wh