归并排序
来源:互联网 发布:淘宝买的电影票能退吗 编辑:程序博客网 时间:2024/06/06 06:45
归并算法的基本概念:
假设有两个已经排序好的数组a和数组b,以及一个临时存储数组temp。设a_pos为指向a数组的指针,b_pos为指向b数组的指针,其初始值均为0.比较a[a_pos]与b[b_pos],取较小(升序,如果想得到降序序列则取较大)的那个值放入临时数组,并且取值后的数组指针后移。重复操作直到其中一个数组的所有值都取遍,而后将另一个数组的剩下的值放入temp数组中,这样就得到了排序后的数组。
示例图(截自《数据结构与算法分析_java语言描述第二版》):
那么,如果我们要对一个输入数组a进行归并排序该怎么做?
这里,我们用到了一个分治的思想。
分:将序列一分为二,对独立出来的数组分别进行排序。
治:对排序后的数组进行归并(如上所描述)。
在程序中,递归的进行分治,就能得到最终的排序数组。
代码:
package mergesort;public class mergesort { public void mergeSort(int[] a, int[] temp, int left, int right) { if( left < right ) { int mid = ( left + right ) / 2; mergeSort(a, temp, left, mid); mergeSort(a, temp, mid+1, right); merge(a,temp,left,mid+1,right); } } public void mergeSort(int[] a) { int[] temp = new int[a.length]; mergeSort(a,temp,0,a.length-1); } //主要的处理程序 public void merge(int[] a, int[] temp, int leftpos, int rightpos, int rightend) { int leftend = rightpos-1; int temppos = leftpos; int num = rightend-leftpos+1; //主循环 while(leftpos<=leftend&&rightpos<=rightend) { if(a[leftpos]<=a[rightpos]) temp[temppos++] = a[leftpos++]; else if(a[leftpos]>a[rightpos]) temp[temppos++] = a[rightpos++]; } while(leftpos<=leftend) temp[temppos++] = a[leftpos++]; while(rightpos<=rightend) temp[temppos++] = a[rightpos++]; for(int i=0;i<num;i++,rightend--) a[rightend] = temp[rightend]; } public static void main(String[] args) { mergesort m = new mergesort(); int[] a = {2,1,6,5,4,3,2}; for(int temp : a) System.out.print(temp); System.out.println(); m.mergeSort(a); for(int temp : a) System.out.print(temp); System.out.println(); }}
输出:
0 0
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- .net 微信开发 从基本配置到完整demo ( 一 )
- 解读PHP数组排序
- iOS开发英汉术语对照(二)
- FPGA基础知识11(FPGA异步复位同步释放解析)
- 大文件下载的实现
- 归并排序
- 2016sdau课程练习专题三 1005
- 反射与内省
- Java中的equals和hashCode方法详解
- 51nod1295 XOR key
- WCF安全机制之自定义账号密码
- 最长回文子串
- Javascript继承机制
- 初识python之简单方便及一些注意事项