排序算法(七):归并排序
2013-12-27 18:39
423 查看
定义:
假设一个序列有n个记录,可以被看成是n个长度为1的子序列,将这些子序列两两归并,等到一个长度为2的子序列,再两两归并,直到子序列长度为n,就得到了一个有序的序列。
时间复杂度:O(nlogn)
实现:
1、递归实现
2、非递归实现
假设一个序列有n个记录,可以被看成是n个长度为1的子序列,将这些子序列两两归并,等到一个长度为2的子序列,再两两归并,直到子序列长度为n,就得到了一个有序的序列。
时间复杂度:O(nlogn)
实现:
1、递归实现
public class merge { public void sort(int[] arr){ int[] newarr= new int[arr.length]; msort(arr,newarr,0,arr.length-1); } /** *递归实现 * @param arr * @param begin * @param end * @return */ private void msort(int[] arr,int[] newarr,int begin,int end){ int[] tarr=new int[arr.length]; if(begin == end){ newarr[begin]=arr[begin]; }else{ int mid=(begin+end)/2; msort(arr,tarr,begin,mid); msort(arr,tarr,mid+1,end); mergearr(tarr,newarr,begin,mid,end); } SortUtils.print(newarr); } private void mergearr(int[] arr,int[] newarr,int begin,int mid,int end){ int i,j,k; for(i=begin,j=mid+1,k=i;i<=mid && j<=end;k++){ if(arr[i]<arr[j]){ newarr[k]=arr[i]; i++; }else{ newarr[k]=arr[j]; j++; } } if(i<=mid){ for(int m=0;m<=mid-i;m++){ newarr[k+m]=arr[i+m]; } } if(j<=end){ for(int m=0;m<=end-j;m++){ newarr[k+m]=arr[j+m]; } } } public static void main(String[] args){ int[] arr= SortUtils.getArray(); merge merge=new merge(); merge.sort(arr); } }
2、非递归实现
public class merge { public void sort(int[] arr){ int k=1; int[] newarr=new int[arr.length]; while(k<arr.length){ psort(arr,newarr,k,arr.length); //SortUtils.print(newarr); k=k*2; psort(newarr,arr,k,arr.length); k=k*2; //SortUtils.print(arr); } } /** *非递归实现 * @param arr * @param newarr * @param k * @param len */ private void psort(int[] arr,int[] newarr,int k,int len){ System.out.println("k:"+k); int i=0; while(i +2*k-1<len){ mergearr(arr,newarr,i,i+k-1,i+2*k-1); i=i+2*k; SortUtils.print(newarr); } if(i+k < len){ mergearr(arr,newarr,i,i+k-1,len-1); System.out.print("merge:"); SortUtils.print(newarr); }else{ for(int j=i;j<len;j++){ newarr[j]=arr[j]; } System.out.print("move:"); SortUtils.print(newarr); } } private void mergearr(int[] arr,int[] newarr,int begin,int mid,int end){ int i,j,k; for(i=begin,j=mid+1,k=i;i<=mid && j<=end;k++){ if(arr[i]<arr[j]){ newarr[k]=arr[i]; i++; }else{ newarr[k]=arr[j]; j++; } } if(i<=mid){ for(int m=0;m<=mid-i;m++){ newarr[k+m]=arr[i+m]; } } if(j<=end){ for(int m=0;m<=end-j;m++){ newarr[k+m]=arr[j+m]; } } } public static void main(String[] args){ int[] arr= SortUtils.getArray(); merge merge=new merge(); merge.sort(arr); } }
相关文章推荐
- 排序算法:归并排序
- Java-时间复杂度为O(nlogn)的排序算法(快速排序, 归并排序, 堆排序, 希尔排序)
- 排序算法:归并排序
- 闲了,再写写排序算法,一个最麻烦的归并排序。
- python实现排序算法二:归并排序
- 排序算法---归并排序
- 排序算法(七):归并排序
- 排序算法之七--归并排序
- 常见排序算法整理(三)----归并排序、快速排序
- 排序算法大集合,插入、选择、冒泡、希尔、堆、归并、快速排序,总有一款适合你
- 排序算法大集锦_二路归并排序_2&3(分治思想)
- 排序算法大集锦_二路归并排序_2&3(分治思想)
- 排序算法总结(六)归并排序
- 排序算法(七):归并排序
- scala 排序算法 归并排序
- 【排序算法】外部排序二 —— 外部排序技术之多路归并
- 基础排序算法-归并排序
- 算法笔记--排序算法-分治法-归并排序
- 排序算法(六)归并排序
- 【排序算法】归并排序原理及Java实现