归并排序算法

8.1.1 归并排序算法(Divide-and-conquer) 方法

伪码描述:

算法: mergeSort(S,N)

输入: n个元素的组成的无需序列S

输出:经排序,S 成为有序的序列

{

      if( 1<n){

   S1=S[0..[n/2]-1];

mergeSort(s1,[n/2]);

  s=merge(s1,s2);

}

 

}

 

因此,若将归并的排序的算法处理长度为N的蓄力恶的所需的时间基座T(n),则有如下ide递归关系的成立:

 T(n)=2xT(n/2)+o(n);

 另外,当子序列长度算算为1时,递归的即可种植,并将该序列作为解直接返回。故有

T(1T(1)=o(1))

有这个两个条件可以导出:

T(n)=o(nlogn)

因此,归并排序可以在O(nlogn)的时间内对长度为n 的序列完成排序。

 

8.1.3 归并操作,就是将两个有序例子合并为一个整体的有序的蓄力,从上面的分析可以看出,

在线程时间内完成规格并,是排序算法能够达到的O(nlogn)复杂度的关键。

有序向量的归并

首先考虑两个有序的自向量的归并,具体算法:

算法:mergeVector(s1,s2)

输入:两个非降的有序子向量的s1和s2,长度分别为n和m.

输出:  将s1 和s2归并为非讲叙列表S 

{

   0.初始化的一个空的列表S;

  1. while(!S1.isempty() or ! S2.isemptry()){

 // 在两个子类表比那位空之气那,不断的累出两个首元素的中的小者e

 if( S1.isEmpty() ){

}else if(S2.isempty)

remove(S1.first);

else if(S1.first().element()>S2.first().element)

else

  //将该元素的插入至尾部

  S.insertLast(e);

返回 S;

 

引入定理: 

算法: mergeVector可在O(n+m) 时间内完成长度的为n和m 的有序向量的归并。

 证明:

      第1局的只需要的o(1 ) 的时间。

    第2据到第 7局的是一个循环,每经过以西迭代的,S1和S2的总长度都会素缎一个单位,因为共需要跌倒i

n+m次。

每次迭代中,只需要要进行常说此的比较猜哦在,getAtRank()操作,replace AtRank() 操作和removeAtRank() 操作,

根据3.1.2 对向量操作的复杂度分析,每一个getAtRank()和replaceAtRank()操作只需要o(1)的时间,虽然的向量元素的删除操作removeAtRank()在情况下的需要的O(n)时间,但是由于的这里删除的总是向量的最后的一个元素,无需的对后续的元素做迁移处理。故也可以在o(1)时间内完成。总傻瓜说是,每次的贴袋的都可以在常数时间的内完成,整个循环只需要的O(n+m)时间。

 

}

 

算法:mergeList(S1,S2)

输入: 两个非降序的有序列表的S1和S2,长度分别为n和m

输出: 将S 1和S2 归并为非降序的表S

{

  0。初始化一个空的列表S;

  1.while(!S1.isempty() or  ! s2.isempty()){
 //在两个子列中变为空的之前,不算抛出两个首元素的小的部分

     if(S1.isEmpty()){

    
}else if(s2.isempty() ){

remove(s1,first);

}else

{

//将该元素的插入到S的尾部

 S.insertLast(e);

返回S;

 

 

}

 

 

 

 

}

 

}

 

 

 

public class Sorter_Mergesort   implements  Sorter{

    protected  Comparator C;

    public Sorter_Mergesort(){
        this(new ComparatorDefault());
    }

    public Sorter_Mergesort(Comprator comp){
         C=comp;
    }

    public void sort(Sequence S){

        int n=S.getSize();
        if (1>n){
            return;
        }

        Sequence S1=new Sequence_DLNode();
        Sequence S2=new Sequence_DLNode();

        while(!S.isempty()){ //将S均匀的分成两个子序列S1和S2
            S1.insertLast(S.remove(S.first())){
                if (!S.isEmpty())
                    S2.insertLast(S.remove(S.first()));
            }

        }
        sort(S1);
        sort(S2);
        merge(S,S1,S2);


    }



    public void  merge(Sequence S,Seqence S1,Seqence S2){
        while (!S1.isemptu() || !S2.isEmpty()){
            Object e;
            if (S1.isEmpty()){
                e=S2.remove(S2.first());
            }else if(S2.isEmpty()) {
               e=S1.remove(S1.first);
            }else if (0<C.compare(S1.first().getElem(),S2.first().getElemt)){
                    e=S2.remove(S2.first);
            }else
                  e=S1.remove(S1.first);
        }
        S.insertLast(e);
    }

}

 

}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

执于代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值