归并排序-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 752909
  • 博文数量: 144
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1150
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-17 14:32
个人简介

小公司研发总监,既当司令也当兵!

文章分类

全部博文(144)

相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: linux

2016-02-17 12:33:42

归并排序,其的基本思路就是将数组分成二组a,b,如果这二组组内的数据都是有序的,那么就可以很方便的将这二组数据进行排序。如何让这二组组内数据有序了?可以将a,b组各自再分成二组。依次类推,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以了。这样通过先递归的分解数列,再合并数列就完成了归并排序。

第一个问题,解决 合并两个有序数组。
这个问题比较简单,把两个有序数组看着两个顺序栈,比较栈顶元素,将较小者弹出到新的队列中;然后再次比较栈顶元素,如此重复。直到一个数组元素全部完毕,那么剩余数组的元素一次添加到新队列的尾部,即完成合并。
实现如下:

点击(此处)折叠或打开

  1. static void mergelist(int lista[], int lena, int listb[], int lenb, int outlist[])
  2. {
  3.     int idxa = 0;
  4.     int idxb = 0;
  5.     int idxout = 0;
  6.     int i;

  7.     while (idxa < lena && idxb < lenb)
  8.     {
  9.         if (lista[idxa] <= listb[idxb])
  10.             outlist[idxout] = lista[idxa];
  11.         else
  12.             outlist[idxout] = listb[idxb];
  13.     }

  14.     if (idxa < lena)
  15.     {
  16.         for (i = idxa; i < lena; i)
  17.             outlist[idxout] = lista[idxa];
  18.     }

  19.     if (idxb < lenb)
  20.     {
  21.         for (i = idxb; i < lenb; i)
  22.             outlist[idxout] = listb[idxb];
  23.     }
  24. }

基于上面的分析和实现,归并排序的算法实现:
(1)以步长为1(相邻元素),进行有序合并;合并后,每两个元素满足有序关系;
(2) 按2的倍数增大步长,同样进行相邻组有序合并,直到步长大于/等于 (len 1)/2,此时完成了最后一次将整个数组分为两个有序数组的合并。即完成了排序。
实现如下:

点击(此处)折叠或打开

  1. void dacsort(int list[], int len)
  2. {
  3.     int grplen = 1;
  4.     int grpleft; // left group start index
  5.     int grplftlen;
  6.     int grprtlen;
  7.     int i;

  8.     int *pconter;
  9.     int *pcur;
  10.     int *pbk;
  11.     int *ptemp;
  12.     int *pmerge;

  13.     // 辅助队列,与原始数据队列交替使用
  14.     pconter = (int *)malloc(sizeof(int) * len);
  15.     if (null == pconter)
  16.         return;
  17.     pbk = list;
  18.     pcur = pconter;

  19.     while(grplen <= (len 1) / 2)
  20.     {
  21.         pmerge = pcur;
  22.         for (grpleft = 0; grpleft < len; grpleft = grplen * 2)
  23.         {
  24.             if (grpleft grplen < len)
  25.             {
  26.                 grplftlen = grplen;

  27.                 if (grpleft 2 *grplen <= len)
  28.                     grprtlen = grplen;
  29.                 else
  30.                     grprtlen = len - (grpleft grplen);
  31.             }
  32.             else
  33.             {
  34.                 grplftlen = len - grpleft;
  35.                 grprtlen = 0;
  36.             }
  37.             
  38.             mergelist(pbk grpleft, grplftlen, pbk grpleft grplen, grprtlen, pmerge);
  39.             pmerge = grplftlen grprtlen;
  40.         }

  41.         ptemp = pbk;
  42.         pbk = pcur;
  43.         pcur = ptemp;
  44.         grplen *= 2;
  45.     }

  46.     if (pbk != list)
  47.     {
  48.         for (i = 0; i < len; i)
  49.             list[i] = pbk[i];
  50.     }
  51.     free(pconter);
  52. }

阅读(2049) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图