归并排序算法(JAVA为主)
归并排序算法,是源于两个有序数组而来的。对于两个有序数组而言,他的时间复杂度为O(n)级的。
//对一个数组两个部分竞相排序
public void sort(int []a,int first,int mid,int last){
int i=first;
int m=mid+1;
//定义一个临时数组,存放排序之后的结果
int []temp=new int[last-i+1];
int k=0;
while(i<=mid&&m<=last)
{
if(a[i]<a[m])
temp[k++]=a[i++];
else
temp[k++]=a[m++];
}
while(i<=mid)
temp[k++]=a[i++];
while(m<=last)
temp[k++]=a[m++];
//最后temp就是这两个数组的升序排序结果了
}
以上就是对一个数组进行排序,但是这个数组是,前m是有序的,后面的也是有序的(只能针对这样的数组)
那么我们就可以讲一个数组,逐步分解,一直分解到有一个数,将相邻的两个有序数组进行排序,即激昂一个数组分解成2块,然后再对两块分解,一直分解到只有一个。
如何分解呢:用递归
public void allsort(int []a,int first,int last)
{
if(first<last)
{
int m=(first+last)/2;
//分成左数组
allsort(a, first, m);
//分成鼬鼠族
allsort(a, m+1, last);
//经过以上两步,数组就是有序的了
//对两个有序数组进行排序
sort(a, first, m, last);
}
}
他将一个数组分成左右两部分,如果左和右不相等,那就继续分,直到想等了,就只有一个元素了,这时再回去,就可以将一个数组排好许
全部代码:
public class Guiping {
public static void main(String[] args) {
int []a=new int[20000];
Random random=new Random();
//随机产生20000个数
for(int i=0;i<20000;i++)
{
a[i]=random.nextInt();
}
Guiping guiping=new Guiping();
long l=System.nanoTime();
guiping.allsort(a, 0, a.length-1);
long l1=System.nanoTime();
//打印她的纳秒数
System.out.println(l1-l);
System.out.println(Arrays.toString(a));
}
//对一个数组两个部分竞相排序
public void sort(int []a,int first,int mid,int last){
int i=first;
int m=mid+1;
//定义一个临时数组,存放排序之后的结果
int []temp=new int[last-i+1];
int k=0;
while(i<=mid&&m<=last)
{
if(a[i]<a[m])
temp[k++]=a[i++];
else
temp[k++]=a[m++];
}
while(i<=mid)
temp[k++]=a[i++];
while(m<=last)
temp[k++]=a[m++];
//最后temp就是这两个数组的升序排序结果了
for(int j=0;j<temp.length;j++)
{
a[first+j]=temp[j];
}
}
//将数组进行分解,然后排序
public void allsort(int []a,int first,int last)
{
if(first<last)
{
int m=(first+last)/2;
//分成左数组
allsort(a, first, m);
//分成鼬鼠族
allsort(a, m+1, last);
//经过以上两步,数组就是有序的了
//对两个有序数组进行排序
sort(a, first, m, last);
}
}
}
这就是归并排序算法