1/1页1 跳转到查看:4225
发新话题 回复该主题

递归算法之归并排序

递归算法之归并排序

归并排序是利用递归和分而治之的技术将数据序列划分成为越来越小的半子表,再对半子表排序,最后再用递归步骤将排好序的半子表合并成为越来越大的有序序列,归并排序包括两个步骤,分别为: QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
1)划分子表 QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
2)合并半子表  QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
首先我们来讨论归并算法,归并算法将一系列数据放到一个向量中,索引范围为[first,last],这个序列由两个排好序的子表构成,以索引终点(mid)为分界线,以下面一个序列为例 QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
7,10,19,25,12,17,21,30,48 QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
这样的一个序列中,分为两个子序列 7,10,19,25  和 12,17,21,30,48,如下图所示: QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
再使用归并算法的时候的步骤如下: QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
第一步:比较v[indexA]=7和v[indexB]=12,将较小的v[indexA]取出来放到临时向量tempArray中,然后indexA加1 QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
第二步:比较v[indexA]=10和v[indexB]=12,将较小的10放到临时变量tempArray中,然后indexA++; QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
第三步:比较v[indexA]=19与v[indexB]=12,将较小的12存放到临时变量tempArray中,然后indexB++; QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
第四步到第七步:按照以上规则,进行比对和存储,得到如下结果: QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
最后一步:将子表b中剩余项添加到临时向量tempArray中 QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
然后将临时变量中的值按照索引位置,拷贝回向量v中,就完成了对向量v的归并排序QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
算法函数为: QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
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
++;
    }
}
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
实现归并排序;归并排序算法分为两步,第一步:先将原来的数据表分成排好序的子表,然后调用 Merger  对子表进行归并,使之成为有序表,例如有如下向量: QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
25,10,7,19,3,48,12,17,56,30,21 QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
对此序列进行归并排序的步骤为:QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
归并算法函数为 QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
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);
}

}
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
归并算法的划分子表和归并子表与原数据序列次序无关,因此算法的最坏情况,最坏情况和平均情况时间复杂度是一样的  QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
下面是归并算法的函数调用图 QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
示例程序:  QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
http://files.cnblogs.com/jillzhang/mergersort.rar QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
人老了,脑袋不好用了,偶尔用算法来练练脑子,可以防止早衰。呵呵QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
随风飘飘天地任逍遥!
代码部落
http://winsonet.cnblogs.com

TOP

 

现在工作好难找啊,真是很无聊,平常很少有时间上网,现在乘着闲有时间可以多上论坛逛逛了,看到这么好的帖子,一定要顶一下,楼主加油!QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ

TOP

 

看起来很好,和你一样, 我决定做些什么,所以支持你的决定。QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
仰望runescape accounts天空

TOP

 

韦迪承认国足五年内重返亚洲一流存在“风险”QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
  中新社北京2月4日电(记者 沈晨)中国足坛“新掌门”韦迪4日在与网友交流时承认,日前他提出的“五年内中国男足重返亚洲一流、女足重返世界一流”的目标确实存在“风险”。QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
  2日下午的媒体记者见面会上,韦迪提出了“五年内中国男足重返亚洲一流、女足重返世界一流”的目标。当时,他还表态:“如果最后做不好,定会引咎辞职。”QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
  韦迪在与网友交流时表示:“更稳妥的说法是,中国国字号的水平明显提升,位序的明显前移。这样提,大家可能更容易接受它。男足亚洲一流和女足世界一流这个提法,坦率地说是有风险的。”QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
  韦迪日前在接受中央电视台记者专访时也曾有过类似的表态。他认为,作为国家体育总局足球运动管理中心主任,就应该给自己提出一个“翘翘脚才可以够得着的目标”,不然工作就会缺乏动力。 QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
  同时,韦迪也表示,为了实现自己的目标,绝不会“不择手段、急功近利”。“我会在职业联赛平稳健康运行的基础上,把主要精力放在国家队水平的提高上。”QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
  韦迪透露,中国国家队水平的提高,要在管理体制上寻找对策。他还分析指出,中国国字号球队水平的下降,主要原因是中国足协的整体组织能力不高。QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
  “在具体人员构成保障上,也会有重新考虑。”韦迪说。QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ
  在谈到如何提高中国男足水平时,这位新任国家体育总局足球运动管理中心主任再度表态要聘请世界一流名帅,并以世界名帅希丁克为例做了说明。QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ

TOP

 

哈哈 好熟悉 以前学过的 数据结构里面QAY ßMpCJbbs.szblogs.comôïÀ¶f‡1ٖÔ

TOP

 
1/1页1 跳转到
发表新主题 回复该主题