Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3506735
  • 博文数量: 1450
  • 博客积分: 11163
  • 博客等级: 上将
  • 技术积分: 11101
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-25 14:40
文章分类

全部博文(1450)

文章存档

2017年(5)

2014年(2)

2013年(3)

2012年(35)

2011年(39)

2010年(88)

2009年(395)

2008年(382)

2007年(241)

2006年(246)

2005年(14)

分类: C/C++

2006-04-26 17:55:29

归并排序法,首先要了解二路归并算法。

所谓二路归并算法,就是指有两个有序队列,设变量i,j,k分别指向有序队列一, 有序队列二,和合并后的有序队列。每次都进行a[i]与b[j]之间的比较,如果a[i]小于b[j],则将a[i]放入到c队列中,然后移动i,直到a[i]大于b[j]。之后b[j]做上面同样的动作,直到a和b队列的所有数据插入完成。

归并排序法的思路是,将一个无序队列,将其在中间分成两部分,依次类推直到初分割的子队列为有序队列(长度为一的元素),然后采用二路归并法,将各个子队列归并为一个有序队列。

算法
void merge(int arr[], int tmparr[], int left, int right, int N)
{
    int llen = right;
    int rlen = N;
    int i=0;
    
    while(left    {
        if(i            tmparr[i++] = arr[left++];
        else
            tmparr[i++] = arr[right++];
    }
   
    while(left < llen) tmparr[i++] = arr[left++];
    while(right < rlen) tmparr[i++] = arr[right++];
   
    for(i=0; N>i; i++)
        arr[i] = tmparr[i];
}


void mergesort(int arr[], int tmparr[], int left, int right)
{
    int mid = (left + right) / 2;
    if(left < right)
    {
        mergesort(arr[], tmparr[], left, mid);
        mergesort(arr[], tmparr[], mid, right);
        merge(arr[], tmparr[], left, mid, right);
    }
}
阅读(857) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~