归并排序
Posted 番茄疯了
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了归并排序相关的知识,希望对你有一定的参考价值。
//归并排序 //是一种稳定的排序方法
//时间复杂度为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)); } }
以上是关于归并排序的主要内容,如果未能解决你的问题,请参考以下文章