归并排序

原创 2012年03月30日 09:58:41
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define MAXSIZE 100
#define ARRAYSIZE 8
void mergeSort(int*, int);
void _mergeSort(int*, int, int);
//合并
void merge(int*, int, int, int);
//复制
void copy(int*, int*, int, int);
int main(void)
{
    int i;
    int array[ARRAYSIZE]= {666, -1023, 68, 2 ,1000, 999, 9, -999};
    mergeSort(array, ARRAYSIZE);
    for (i = 0; i < ARRAYSIZE; ++i)
    {
        printf("%d ", array[i]);
    }
    printf("\n");
    return 0;
}
void mergeSort(int *array, int length)
{
    if (NULL == array || 0 == length)
    {
        return ;
    }
    _mergeSort(array, 0, length - 1);
}
void _mergeSort(int *array, int begin, int end)
{
    if (begin >= end)
    {
        return ;
    }
    int middle = begin + ((end - begin) >> 1);
    _mergeSort(array, begin, middle);
    _mergeSort(array, middle + 1, end);
    merge(array, begin, middle, end);
}
//将a[begin, middle]和a[middle + 1, end]归并
void merge(int *array, int start, int middle, int end)
{
    int length = end - start + 1;
    int b[length];
    memset(b, 0, sizeof(int) * length);
    int left = start;
    int right = middle + 1;
    int all = 0;
    while(right <= end && left <= middle)
    {
        if(array[left] < array[right])
        {
            b[all] = array[left];
            ++left;
        }
        else
        {
            b[all] = array[right];
            right ++;
        }
        ++all;
    }
    /* move the left data */
    if(left <= middle)
    {
        memmove(&b[all], &array[left], sizeof(int) * (middle - left + 1));
    }
    if(right <= end)
    {
        memmove(&b[all], &array[right], sizeof(int) * (end - right + 1));
    }
    memmove(&array[start], b, sizeof(int) * length);
    /*
    all = 0;
    for (i = start; i <= end; ++i)
    {
        array[i] = b[all];
        ++all;
    }
    */
}

利用Python实现归并排序

在讲归并排序之前我们先来了解一下什么是分治算法。为什么归并排序属于分治算法的体现。 分治算法分治算法基本思想就是将一个比较大规模的问题分解成为若干个规模较小的问题来解决。这些小问题相当于是原问题的子集...
  • minxihou
  • minxihou
  • 2016年07月04日 15:09
  • 2144

归并排序及代码实现

自己实现归并排序+快速排序,二者都是嵌套加递归 归并排序: //归并排序 #include #include using namespace std; void merge_sort(i...
  • chuchus
  • chuchus
  • 2014年03月22日 20:30
  • 1388

【排序】归并排序(递归和非递归版本)

#include using namespace std; void merge(int* a, int* temp, int begin, int middle, int end){ int i...
  • ruan875417
  • ruan875417
  • 2016年05月14日 13:47
  • 801

算法系列(四)排序算法中篇--归并排序和快速排序

在算法系列(三)排序算法上篇 一文中,介绍了冒泡排序,插入排序和选择排序算法。这篇文章继续讲解排序算法。 概述 冒泡排序,插入排序和选择排序算法这些算法的时间复杂度都是O(N^2),是否有更高效的排序...
  • robertcpp
  • robertcpp
  • 2016年05月30日 23:04
  • 3383

归并排序及其应用

1 归并排序的特点归并排序是一种利用分治技术来实现一种稳定排序算法,该算法的时间复杂度为O(nlogn),该算法的常数因子比较大,通常应用于数据量比较大的场合。通常,我们所学习的归并排序算法都是二路归...
  • mitedu
  • mitedu
  • 2009年02月12日 16:22
  • 2921

归并排序(视频+详解+代码)

归并排序 概述:归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到...
  • dreamzuora
  • dreamzuora
  • 2016年10月16日 15:38
  • 983

二路归并排序算法(递归&非递归)

归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的,然后再把有序子序列合并为整体有序序列。 归并排序是建立在归并操作上的...
  • prstaxy
  • prstaxy
  • 2012年11月09日 14:31
  • 17491

八大内部排序 -- 归并排序

归并排序(merge-sort):将两个或两个以上的有序列表组合成一个新的有序表,合并的m,n长度的两个表的复杂度为O(m+n),n个数的序列进行归并共有ceil(logn)次,每一次合并都是n常数级...
  • Szu_AKer
  • Szu_AKer
  • 2016年08月31日 23:49
  • 460

[STL] List 中sort为什么采用归并排序

这几天在看STL(SGI版本----侯捷),在看完第一章后有点懵,但还是很震撼,STL的设计理念确实很好,至于有多么好我们都懂,所以就不再评价了。      由于刚刚开始看,所以有些东西并不是很透彻,...
  • zr1076311296
  • zr1076311296
  • 2016年05月22日 19:07
  • 802

算法导论:归并排序java实现

这是归并排序的部分代码,个人认为归并排序作为算法课的前导算法算是一个比较难的问题因为他涉及到了我们都比较恐惧的递归运算。说到递归我们都是非常头疼的,但是递归较其他用迭代来实现的算法又算是理解起来比较简...
  • xidian_db
  • xidian_db
  • 2015年03月30日 16:33
  • 388
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:归并排序
举报原因:
原因补充:

(最多只允许输入30个字)