归并算法的思想是把待排序的数逐级递归拆分成一棵树然后在从根像上合并,但是每次合并的过程都需要进行一次排序。因此我想到一个方法,在原来拆分的基础上加以改进,让合并过程去掉排序步骤,最后直接合并得到排好序的数。例如,待排序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);
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;
}
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) ;
}
{
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));
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));