Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1146645
  • 博文数量: 103
  • 博客积分: 1897
  • 博客等级: 上尉
  • 技术积分: 1717
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-19 21:02
文章分类

全部博文(103)

文章存档

2013年(19)

2012年(84)

分类: Java

2012-05-04 13:07:43

  合并排序可以说是应用分治技术的一个相当perfect的例子,这我感觉有点像中国古代的大事小,小事化了的思想。所以说算法还是与我们日常的生活是息息相关的。
 好了。其实,简单来说,合并排序就是把一个需要排序的 数组一分为二,让字数组分别递归排序。最后再合并起来。

点击(此处)折叠或打开

  1. public class MergeSort {
  2.     // 合并排序,时间复杂度为nlogn
  3.     public static void mergeSort(int num[]){
  4.         int n = num.length;
  5.         if(n>1){
  6.             int a[] = new int[n/2];
  7.             int b[] = new int[n-n/2];
  8.          System.arraycopy(num, 0, a, 0, n/2);
  9.          System.arraycopy(num, n/2, b, 0, n-n/2); //复制到新的数组里面
  10.          mergeSort(a);
  11.          mergeSort(b);//分治排序
  12.          merge(a,b,num); //合并
  13.         }
  14.         
  15.     }
  16.     public static void merge(int a[],int b[],int c[]){
  17.         int i = 0;
  18.         int j = 0;
  19.         int k = 0;
  20.         while((i<a.length)&&(j<b.length)){ //将元素按照大小顺序排序
  21.             if(a[i]>=b[j]){
  22.                 c[k++] = a[i++];
  23.             }else{
  24.                 c[k++] = b[j++];
  25.             }
  26.         }
  27.         if(i<a.length)
  28.             System.arraycopy(a, i, c, k, a.length-i);
  29.             else
  30.                 System.arraycopy(b, j, c, k, b.length-j);//复制剩下的元素
  31.     }
  32.     
  33.     public static void main(String[] arg){
  34.         int n[]={1,23,45,3,3,2,6};
  35.         mergeSort(n);
  36.             for(int num:n)
  37.             System.out.println(num);
  38.         
  39.         
  40.         
  41.     }

  42. }

这是我写的合并排序的算法,其实,老实说,合并排序在最坏的情况下的键值比较次数十分接近任何基于比较的排序算法在理论上能够达到的最少次数。当是,合并排序每次都需要额外的空间。但是,合并排序却很好的体现了分治思想的内涵,以后的快排就是基于这种思想而来的。另外,合并排序是一中稳定的排序算法。
阅读(654) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~