算法(三)合并排序
2014-11-02 16:32
127 查看
合并排序要比前面两种排序要稍复杂些。合并排序是在算法中分治思想的一个很好的实例,接下来我们一起来学习合并排序是如何实现的。
首先我先给大家展示一张图:
![](http://img.blog.csdn.net/20141102164806843?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVG9wbGlmZXd3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
从上图中我们可以看出,首先我们对一个序列进行分割,直至分到最小单元时,然后对最小的单元进行排序,然后把两个排好序的单元进行合并。此处划分到最小单元就是一个分治算法的体现,如果大家对分治算法不明白的可以去查找相关的资料学习,分治算法是解决问题的一个非常好的办法,有句俗语就是说明了这个道理“大事化小,小事化了”,可见我们的祖先是多么的聪明。接下来直接给大家上代码,如果有问题的可以提出来:
![](http://img.blog.csdn.net/20141102165734156?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVG9wbGlmZXd3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
Live as if you were to die tomorrow. Learn as if you were to live forever.
首先我先给大家展示一张图:
从上图中我们可以看出,首先我们对一个序列进行分割,直至分到最小单元时,然后对最小的单元进行排序,然后把两个排好序的单元进行合并。此处划分到最小单元就是一个分治算法的体现,如果大家对分治算法不明白的可以去查找相关的资料学习,分治算法是解决问题的一个非常好的办法,有句俗语就是说明了这个道理“大事化小,小事化了”,可见我们的祖先是多么的聪明。接下来直接给大家上代码,如果有问题的可以提出来:
package gzw.pkg1; /** * Created by Toplife on 2014/11/2. */ public class Merge { //递归分成小部分 public void merge_sort(int[] arrays,int start,int end){ if(start<end){ int m=(start+end)/2; merge_sort(arrays,start,m); merge_sort(arrays,m+1,end); combin_arrays(arrays,start,m,end); } } //合并数组 public void combin_arrays(int[] arrays,int start,int m,int end){ int length=end-start+1; int temp[]=new int[length];//用来存放比较的数组,用完复制回到原来的数组 int i=start; int j=m+1; int c=0; while(i<=m &&j<=end){ if(arrays[i]<arrays[j]){ temp[c]=arrays[i]; i++; c++; }else{ temp[c]=arrays[j]; j++; c++; } } while(i<=m){ temp[c]=arrays[i]; i++; } while(j<=end){ temp[c]=arrays[j]; j++; } c=0; for(int t=start;t<=end;t++,c++){ arrays[t]=temp[c]; } snp(arrays); } //打印数组 public void snp(int[] arrays){ for(int i=0;i<arrays.length;i++){ System.out.print(arrays[i]+" "); } System.out.println(); } public static void main(String[] args) { Merge m=new Merge(); int a [] ={8,3,2,9,7,1,5,4}; m.merge_sort(a,0,a.length-1); } }
Live as if you were to die tomorrow. Learn as if you were to live forever.
相关文章推荐
- 算法导论2.4 合并排序求逆序数
- 老老实实复习算法: 3 合并排序
- “用最小堆将k个已排序链表合并为一个排序链表”(算法导论 练习6.5-9)
- 设计一个算法将两个字符串合并按字母排序
- 设计一个算法将两个字符串合并按字母排序
- 插入排序,合并排序,堆排序,快速排序,计数排序的实现(算法导论)
- 设计一个算法将两个字符串合并按字母排序
- 基本算法简单实现-二分法查找、合并排序、冒泡排序、插入排序、选择排序、快速排序
- 算法(分治)合并排序和快速排序
- 设计一个算法将两个字符串合并按字母排序
- 算法--合并排序
- 【算法导论】 2.3合并排序
- 算法题 -- 合并两个大小为n的已排序数组
- 算法入门-分治法(合并排序中不使用哨兵)
- 算法-----合并排序
- 算法: 找子集合并按权值和排序 (货郎问题辅助算法)
- 算法中分治策略实现合并排序
- 每天一算法,我是IT人生 --合并排序
- 面试算法(十六)合并两个排序的链表
- 设计一个算法将两个字符串合并按字母排序