【排序算法】归并排序(java实现)
2016-04-28 15:58
537 查看
1.基本思想:
归并排序指的是将两个已经排序的序列合并成一个序列的操作。主要分为两种,分别是自顶向下的排序方式和自底向上的排序方式。对于自顶向下的排序算法:
采用分治法进行自顶向下的程序设计方式,分治法的核心思想就是分解、求解、合并。
(1)将长度为N的无序序列平均分割成两个子序列
(2)对这两个子序列分别进行归并排序
(3)将排序好的两个子序列进行归并排序
对于自底向上的排序算法:
第1 趟归并排序,将这含有N个元素的无序序列看成N个长度为1 的有序序列,两两归并。如果是偶数个子序列,则得到长度为N/2 的子序列;如果是奇数个,则最后一个轮空,得到(n-1)/2 +1 个子序列
第2趟归并排序,第1趟归并所得到的有序的子序列两两归并。
如此反复,直至得到一个长度为n的有序序列为止。
2.算法分析:
时间复杂度:O(nlog2n)空间复杂度 : O(n)
稳定性:稳定
3.算法实现:
3.1自顶向下:
//归并排序 自顶向下 public static void Merge(int[] array,int start ,int mid,int end){ int i=start,j=mid+1,l=0; int[] total = new int[end - start+1]; while(i <= mid && j <= end){ if(array[i] <array[j]){ total[l++] = array[i++]; }else{ total[l++] = array[j++]; } } while(i <= mid) total[l++] =array[i++] ; while(j <= end) total[l++] =array[j++] ; for(i = 0; i < l; i++){ array[start + i] = total[i]; } } public static void MergeSort(int[] array,int start,int end){ if(start < end){ int mid =(start + end)/2; //int mid = (start & end) + (start ^ end)>>1; MergeSort(array,start,mid); MergeSort(array,mid+1,end); Merge(array,start,mid,end); } }
3.2自底向上:
//自底向上 public static void MergeGroup(int[] array,int len, int sub_len){ int new_sublen = sub_len*2; int i; for(i = 0; i + new_sublen - 1 < len; i += new_sublen){ Merge(array,i,i+sub_len-1,i+new_sublen-1); } //进行最后一次归并 if (i == 0) Merge(array,i,i+sub_len-1,len-1); } public static void MergeSort2(int[] array){ int len = array.length ; if (len <= 0) return; for (int n =1; n < len; n*=2){ MergeGroup(array,len,n); } }
相关文章推荐
- cmd执行Java源码需要注意的一些地方
- 深入理解Java之线程池(下)
- 深入理解Java之线程池(中)
- java 集合----Map、Collection
- 深入理解Java之线程池(上)
- SpringMVC 过滤参数的非法字符
- 多数据源的配置
- Java Web的数据库操作
- java观察者模式
- eclipse, Log4j配置(真心的详细~)
- 怎么在MySQL官网下载java连接MySQL数据库的驱动jar包
- java操作sqlserver
- RxJava学习(九)
- Java 一个特殊的类 ServiceLoader<S> 详解
- ubuntu 安装配置jdk
- 使用Retrofit2 RxJava 文件上传
- Java基础知识IO流(流操作规律)
- Java静态类Static
- 几本推荐的Java书
- Spring MVC 教程,快速入门,深入分析