归并排序算法

来源:互联网 发布:抹黑中国的网络大v 编辑:程序博客网 时间:2024/06/04 00:55

   归并排序算法(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++];elsetemp[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++];elsetemp[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);}}}

这就是归并排序算法


原创粉丝点击