二路归并排序算法实现-完整C语言程序

/***********************************************************************************************
1.设定两个指针,最初位置分别为两个已经排序序列的起始位置
2.比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
3.重复步骤3直到某一指针达到序列尾
4.将另一序列剩下的所有元素直接复制到合并序列尾
归并排序:
归并排序具体工作原理如下(假设序列共有n个元素):
1.将序列每相邻两个数字进行归并操作,形成floor(n / 2)个序列,排序后每个序列包含两个元素
2.将上述序列再次归并,形成floor(n / 4)个序列,每个序列包含四个元素
3.重复步骤2,直到所有元素排序完毕 

归并排序是稳定的,它的最差,平均,最好时间都是O(nlogn)。但是它需要额外的存储空间.
 何问起 hovertree.com

归并排序法(Merge Sort,以下简称MS)是分治法思想运用的一个典范。
其主要算法操作可以分为以下步骤:
Step 1:将n个元素分成两个含n/2元素的子序列
Step 2:用MS将两个子序列递归排序(最后可以将整个原序列分解成n个子序列)
Step 3:合并两个已排序好的序列  

************************************************************************************************/  

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<climits>
#include<cstdlib>
#include<time.h>
#include<cstdlib>
#include<cstdio>
using namespace std;
void Random(int a[],int n)
{
    int i=0;
    srand( (unsigned)time( NULL ) );
    while(i<n)
    {
        a[i++]=rand();
    }
}
void merge(int *a, int low, int mid, int high) //归并操作
{
    int k, begin1, begin2, end1, end2;
    begin1 = low;
    end1 = mid;
    begin2 = mid + 1;
    end2 = high;
    int *temp = (int *) malloc((high - low + 1) * sizeof(int));
    for(k = 0; begin1 <= end1 && begin2 <= end2; k++) //自小到大排序
    {
        if(a[begin1] <= a[begin2])
            temp[k] = a[begin1++];
        else
            temp[k] = a[begin2++];
    }
    if(begin1 <= end1) //左剩
        memcpy(temp + k, a + begin1, (end1 - begin1 + 1) * sizeof(int));
    else //右剩
        memcpy(temp + k, a + begin2, (end2 - begin2 + 1) * sizeof(int));
    memcpy(a + low, temp, (high - low + 1) * sizeof(int)); //排序后复制到原数组
    free(temp); //释放空间
}
void merge_sort(int *a, unsigned int begin, unsigned int end)
{
    int mid;
    if(begin < end)
    {
        mid=begin+(end-begin)>>1;
        //mid = (end + begin) / 2;  防止数据加法溢出
        merge_sort(a, begin, mid); //分治
        merge_sort(a, mid + 1, end); //分治
        merge(a, begin, mid, end);  //合并两个已排序的数列
    }
}
int main()
{
    int a[20];
    Random(a,20);
    for(int i=0;i<20;i++)
    {
        cout<<" "<<a[i]<<" ";
    }  

    merge_sort(a, 0, 20-1);
    for(int i=0;i<20;i++)
    {
        cout<<" "<<a[i]<<endl;
    }  

    return 0;  

}  

推荐:http://www.cnblogs.com/roucheng/p/cppjy.html

时间: 2024-10-05 21:21:21

二路归并排序算法实现-完整C语言程序的相关文章

二路归并排序算法

归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序,再使子序列段间有序.若将两个有序表合并成一个有序表,称为二路归并.      归并过程为:比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1:否则将第二个有序表中的元素a[j]复制到r[k]中,并令j和k分别加上1,如此循环下去,直到其

01-C语言程序框架

学习重点: 框架介绍 最简C程序 学习内容: 1.每一个完整C语言程序都必须包含且只包含一个“main”函数,这是程序的入口和出口,它总是在程序执行时首先被调用. 2.#include是一个预编译指令,让编译器在创建可执行程序之前预先调用系统内置函数或者自定义函数. 3.最简C语言程序: #include<stdio.h> int main() { printf("Hello World\n"); return 0; }

【数据结构与算法】二路归并排序

二路归并排序的时间复杂度是O(n*log2n),空间复杂度是O(n). 代码如下: /** * 源码名称:MergeSort.java * 日期:2014-08-11 * 程序功能:合并排序 * 版权:[email protected] * 作者:A2BGeek */ public class MergeSort { public void mergeSort(int[] in) { int length = in.length; int tmp[] = new int[length]; mer

排序算法——二路归并排序

二路归并排序主要运用了"分治算法",分治算法就是将一个大的问题划分为n个规模较小而结构相似的子问题. 这些子问题解决的方法都是类似的,解决掉这些小的问题之后,归并子问题的结果,就得到了"大"问题的解. 二路归并排序主旨是"分解"与"归并". 下面是参考<高性能JavaScript>中的代码: function merge(left, right) { var result = []; while(left.leng

算法导论笔记(二)二路归并排序

二路归并排序 归并排序采用了一种”分而治之“的策略:将原问题分解成N个规模较小而结构与原问题相似的子问题:递归求解这些子问题,然后合并其结果,从而得到原问题的解. 分治模式一般遵循以下三个步骤: 分解(Divide):将原问题分解成若干子问题: 解决(Conquer):递归地求解各子问题.若子问题足够小,则直接求解: 合并(Combine):将子问题的解合并成原问题的解. ”二路归并"的算法也遵循以下三个步骤: 分解:将原序列中拥有的N个元素分解各含N / 2个元素的子序列: 解决:用合并排序法

排序算法大集锦_二路归并排序_2&3(分治思想)

第一段代码和合并排序差不多,用它来和第二段代码--二路归并排序作对比. 这一系列博客的特点就是--给出每趟排序的结果 本来想着好好写一下过程,弄个图片什么的,不过觉得网上的解析太多了,都比较好,所以这些博客就算是对自己的总结吧. #include <stdio.h> #include <limits.h> #include <malloc.h> void merge(int *m, int x, int y, int z) { int b1,b2,i,j,k; b1=y

排序算法之二路归并排序

基本思想 首先将待排序的元素序列分成两个长度相等的子序列,为每一个子序列排序,然后再将它们合并成一个序列. 代码 private void mergeSort(int[] a, int[] b, int left, int right) { if (left < right) { int middle = (left + right) / 2; mergeSort(a, b, left, middle); mergeSort(a, b, middle + 1, right); merge(a,

算法之二路归并排序

public class SortTest { private static int ARRAY_NUMBER=10; public static void main(String[] args) { // TODO Auto-generated method stub //准备待排序的序列 Random random = new Random(); int[] array = new int[ARRAY_NUMBER]; for(int i = 0 ; i < array.length; i+

关于中值滤波算法,以及C语言实现(转)

源:关于中值滤波算法,以及C语言实现 1.什么是中值滤波? 中值滤波是对一个滑动窗口内的诸像素灰度值排序,用其中值代替窗口中心象素的原来灰度值,它是一种非线性的图像平滑法,它对脉冲干扰级椒盐噪声的抑制效果好,在抑制随机噪声的同时能有效保护边缘少受模糊. 中值滤波可以过滤尖峰脉冲.目的在于我们对于滤波后的数据更感兴趣.滤波后的数据保留的原图像的变化趋势,同时去除了尖峰脉冲对分析造成的影响. 以一维信号的中值滤波举例.对灰度序列80.120.90.200.100.110.70,如果按大小顺序排列,其