首页 > 编程语言 > 详细

归并排序

时间:2018-05-20 15:11:42      阅读:216      评论:0      收藏:0      [点我收藏+]
//归并排序
//是一种稳定的排序方法
//时间复杂度为nlog2(n)
//空间复杂度为O(n) package mergesort; import java.util.Arrays; public class TestMergeSort { //归并排序 public static void mergeSort(int[]array) { //遍历序列 产生每归并段1个数 2个数 4个数 for(int i = 1;i < array.length;i = i*2) { merge(array,i); } } public static void merge(int[]array,int gap) {//gap为每个归并段的个数 int start1 = 0; int end1 = start1+gap-1; int start2 = end1+1; int end2 = start2+gap-1 < array.length-1 ? start2+gap-1:array.length-1; //进行排序 int[]brray = new int [array.length]; int i = 0; while(start2<array.length){//肯定有两个归并段 while(start1 <= end1 && start2 <= end2){//两个归并段是否都有数据 if(array[start1]<array[start2]){ brray[i++]=array[start1++]; }else{ brray[i++]=array[start2++]; } } while(start1<=end1){//没有第二个归并段了 brray[i++]=array[start1++]; } while(start2<=end2){//第一个归并段都放到brray了 brray[i++]=array[start2++]; } //重新归位 赶下一个归并段 start1=end2+1; end1=start1+gap-1; start2=end1+1; end2= start2+gap-1 < array.length-1 ? start2+gap-1:array.length-1; } //剩下的start1和end1之间的的数据都放到brray中 while(start1 < array.length){ brray[i++]=array[start1++]; } //将已经有序的中间数组(tmp)的数据放回原来的数组中 for(int j = 0;j < brray.length;j++){ array[j]=brray[j]; } } public static void main(String[] args) { int[]array={11,17,23,12,3,35,7}; mergeSort(array); System.out.println(Arrays.toString(array)); } }

技术分享图片技术分享图片

归并排序

原文:https://www.cnblogs.com/ioio2/p/9063217.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!