归并算法的改进与简化设计与实现

        归并算法的思想是把待排序的数逐级递归拆分成一棵树然后在从根像上合并,但是每次合并的过程都需要进行一次排序。因此我想到一个方法,在原来拆分的基础上加以改进,让合并过程去掉排序步骤,最后直接合并得到排好序的数。例如,待排序3,5,2,2,7.1,9,8。。。我们每次取待排序数的第一个,这是我们取3.那么比3小的我们放入ArrayList a中(可以使用其它方法来存储),比3大的放入b中,和3一样大的放入c中,那么第一次拆分就成为a:2,2,1   b:5,7,9,8    c: 3   .然后递归a和b. a中又分解出 {a:1  b:为空  c:2,2},b中分解出{a:为空 b:7,9,8  c:5}.然后依次类推继续递归a,b直到a,b,为空。最后合并,合并过程那么a中的放的是最小的,b中放的是最大的,c中是中间的,所以我们只要按照a,c,b的顺序合并必然得到按从小到大排好序的数,如果按b,c,a那么就是从大到小的数。下面看我实现的代码:
                                                                                   (流程)
                                                                              3,5,2,2,7.1,9,8
                           第一次: a                                                            b                                     c
                                        2,2,1                                                   5,7,9,8                                  3
            
             第二次:   a            b             c                                a            b              c                
                              1           null         2,2                             空         7,9,8           5
 
         第三次:     .              .            .                                 .        a      b      c
                                                                                                   空   9,8    7
                                    依次类推           ................................................................................................................................直到a,b为空或一结束递归。
  
import java.util.ArrayList;
import java.util.Random;
/**
 *
 * @author WangMengZhong
 *
 */
public class SortSet
{
  
public ArrayList<Integer> sSort(ArrayList<Integer> list)
   { 
    ArrayList<Integer> a = new ArrayList<Integer>();  
    ArrayList<Integer> b = new ArrayList<Integer>();
    ArrayList<Integer> c = new ArrayList<Integer>();
    int len = list.size();
    c.add(0, list.get(0));
   if(len>=2)      
   {
    for(int i=1;i<len;i++)
    {
    if(list.get(i) < list.get(0))
    {
     a.add(list.get(i));
    }
    else if(list.get(i)==list.get(0))
    {
     c.add(list.get(i));
    }
    else
    {
     b.add(list.get(i));
    }
    }
   }
   else   //为空或一直接返回
   {
    return list;
   }
   if(a.size()>0) //为空结束递归
   {
    a = sSort(a);
   }
   if(b.size()>0)   //为空结束递归
   {
    b = sSort(b);
   }
   int na = a.size();
   int nb = b.size();
   int nc = c.size();
   int leng = 0;
   if(a.size()>0)
   {
     for(int ma=0;ma<na;ma++)
     {
    list.set(leng, a.get(ma));
    leng++;
     }
   }
   if(c.size()>0)
   {
     for(int mc=0;mc<nc;mc++)
     {
    list.set(leng, c.get(mc));
    leng++;
     }
   }
   if(b.size()>0)
   {
     for(int mb=0;mb<nb;mb++)
     {
    list.set(leng, b.get(mb));
    leng++;
     } 
   }
    return list;
   }
public static void main(String[] args)
   {
    ArrayList<Integer> list = new ArrayList<Integer>();
    int j = 1<<15;
    Random random = new Random();
    for(int i=0;i<j;i++)
    {
     list.add(i, Math.abs(random.nextInt()) % 10000 + 1) ;
    }
    SortSet sort = new SortSet();
    list = sort.sSort(list);
    for(int i=0;i<j;i++)
    {
     if(i>=1)
     {
       System.out.println(list.get(i-1)<=list.get(i));
        }
     System.out.println("第"+i+"次:"+list.get(i));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值