博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
归并排序
阅读量:4289 次
发布时间:2019-05-27

本文共 1664 字,大约阅读时间需要 5 分钟。

 归并排序是利用递归和分而治之的技术将数据序列划分成为越来越小的半子表,再对半子表排序,最后再用递归步骤将排好序的半子表合并成为越来越大的有序序列,归并排序包括两个步骤,分别为:

      1)划分子表

      2)合并半子表 

     首先我们来讨论归并算法,归并算法将一系列数据放到一个向量中,索引范围为[first,last],这个序列由两个排好序的子表构成,以索引终点(mid)为分界线,以下面一个序列为例

    7,10,19,25,12,17,21,30,48

   这样的一个序列中,分为两个子序列 7,10,19,25  和 12,17,21,30,48,如下图所示:

    

再使用归并算法的时候的步骤如下:

 第一步:比较v[indexA]=7和v[indexB]=12,将较小的v[indexA]取出来放到临时向量tempArray中,然后indexA加1

  

 

 第二步:比较v[indexA]=10和v[indexB]=12,将较小的10放到临时变量tempArray中,然后indexA++;

  

第三步:比较v[indexA]=19与v[indexB]=12,将较小的12存放到临时变量tempArray中,然后indexB++;

   

第四步到第七步:按照以上规则,进行比对和存储,得到如下结果:

   

最后一步:将子表b中剩余项添加到临时向量tempArray中

    

然后将临时变量中的值按照索引位置,拷贝回向量v中,就完成了对向量v的归并排序

 算法函数为:

public void Merger(int[] v, int first, int mid, int last)
       {


           Queue<int> tempV = new Queue<int>();
           int indexA, indexB;
           //设置indexA,并扫描subArray1 [first,mid]
           //设置indexB,并扫描subArray2 [mid,last]
           indexA = first;
           indexB = mid;
           //在没有比较完两个子标的情况下,比较 v[indexA]和v[indexB]
           //将其中小的放到临时变量tempV中
           while (indexA < mid && indexB < last)
           {

               if (v[indexA] < v[indexB])
               {

                   tempV.Enqueue(v[indexA]);
                   indexA++;
               }
               else
               {

                   tempV.Enqueue(v[indexB]);
                   indexB++;
               }
           }
           //复制没有比较完子表中的元素
           while (indexA < mid)
           {

               tempV.Enqueue(v[indexA]);
               indexA++;
           }
           while (indexB < last)
           {

               tempV.Enqueue(v[indexB]);
               indexB++;
           }
           int index = 0;
           while (tempV.Count > 0)
           {

               v[first+index] = tempV.Dequeue();
               index++;
           }
       }

 

   实现归并排序;归并排序算法分为两步,第一步:先将原来的数据表分成排好序的子表,然后调用 Merger  对子表进行归并,使之成为有序表,例如有如下向量:

  25,10,7,19,3,48,12,17,56,30,21

对此序列进行归并排序的步骤为:

   

归并算法函数为

public void MergerSort(int[] v, int first, int last)
       {


           if (first + 1 < last)
           {

               int mid = (first + last) / 2;
               MergerSort(v, first, mid);
               MergerSort(v, mid, last);
               Merger(v, first, mid, last);
           }
       }

 

归并算法的划分子表和归并子表与原数据序列次序无关,因此算法的最坏情况,最坏情况和平均情况时间复杂度是一样的

下面是归并算法的函数调用图

        

示例程序: 

转载地址:http://wjrgi.baihongyu.com/

你可能感兴趣的文章
(原创)android6.0系统 PowerManager深入分析
查看>>
【转】Android kernel启动流程
查看>>
Linux启动过程详解
查看>>
linux内核启动过程学习总结
查看>>
[原创]Linux系统启动过程分析
查看>>
do_initcall解析
查看>>
Linux开机启动过程详细分析
查看>>
Linux的i2c驱动详解
查看>>
设备模型之kobject,kset及其关系
查看>>
Linux内核源码分析--内核启动之(5)Image内核启动(rest_init函数)(Linux-3.0 ARMv7)
查看>>
Linux环境进程间通信(一):管道及有名管道
查看>>
多线程编程
查看>>
Linux网络编程:原始套接字的魔力【上】
查看>>
进程间通信---共享内存
查看>>
进程间通信--信号(进程间通信唯一的异步方式)
查看>>
linux 标准IO缓冲机制探究
查看>>
【转】linux网络编程——套接字(socket)入门
查看>>
【原创】samba移植到android流程
查看>>
【原创】boa服务移植到安卓手机
查看>>
msgrcv error : Identifier removed(ERMID)错误解决;
查看>>