标签:原来 时间 空间 merge 复杂度 .com height art lse
//归并排序 //是一种稳定的排序方法
//时间复杂度为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)); } }
标签:原来 时间 空间 merge 复杂度 .com height art lse
原文地址:https://www.cnblogs.com/ioio2/p/9063217.html