归并排序 MergeSort
Posted TQCAI
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了归并排序 MergeSort相关的知识,希望对你有一定的参考价值。
今天第一次看懂了严奶奶的代码( ̄▽ ̄)~*,然后按照厌奶那的思路进行了一波coding,稍加调试后即可跑起来。
学习链接:排序七 归并排序、图解排序算法(四)之归并排序
merge函数:将两个有序序列拼接成一个有序序列
1 //对[a,b]∈in,[b+1,c]∈in进行排序。 2 //对in中的数据进行排序之后,输出到out中 3 //升序 4 void merge(int in[],int a,int b,int c){ 5 //设置变量i对[a,b]进行遍历,j对[b+1,c]进行遍历,k对out进行遍历 6 int[] out=new int[in.length]; 7 int i,j,k; 8 for(i=a,j=b+1,k=a; 9 i<=b && j<=c; 10 k++){ 11 if(in[i]<in[j]){//挑选最小的元素放入out中 12 out[k]=in[i++];//i∈[a,b]中的元素是最小的 13 }else{ 14 out[k]=in[j++];//j∈[b+1,c]中的元素是最小的 15 } 16 } 17 //遍历完之后,对剩余元素进行处理 18 int m=0,n=0; 19 boolean move=false; 20 if(i<=b){m=i;n=b;move=true;} //i∈[a,b]中的元素没有遍历完 21 if(j<=c){m=j;n=c;move=true;} //j∈[b+1,c]中的元素没有遍历完 22 for(i=m;i<=n && move;i++) out[k++]=in[i]; 23 for(i=a;i<=c;i++) in[i]=out[i];//临时数组放回原数组 24 25 int t; 26 t=0; 27 }
递归函数MSort:
1 //递归函数 2 void MSort(int in[],int a,int b){//将[a,b]的元素进行排序 3 if(a!=b){ 4 int split=(a+b)/2; 5 MSort(in,a,split); 6 MSort(in,split+1,b); 7 merge(in,a,split,b);//栈底 8 } 9 }
归并排序MergeSort:
1 MergeSort(int[] nums){ 2 MSort(nums,0,nums.length-1); 3 sortAns=nums; 4 }
完整代码:
1 public class Main { 2 3 public static void main(String[] args) { 4 int []nums={2,1,3,0,-1,12,90,23,1}; 5 MergeSort sort=new MergeSort(nums); 6 System.out.print(sort); 7 sort.test(); 8 } 9 } 10 11 class MergeSort{ 12 int [] sortAns; 13 public String toString(){ 14 int i; 15 String str=new String(""); 16 for(i=0;i<sortAns.length;i++) str+=String.valueOf(sortAns[i])+" "; 17 str+="\\n"; 18 return str; 19 } 20 //对[a,b]∈in,[b+1,c]∈in进行排序。 21 //对in中的数据进行排序之后,输出到out中 22 //升序 23 void merge(int in[],int a,int b,int c){ 24 //设置变量i对[a,b]进行遍历,j对[b+1,c]进行遍历,k对out进行遍历 25 int[] out=new int[in.length]; 26 int i,j,k; 27 for(i=a,j=b+1,k=a; 28 i<=b && j<=c; 29 k++){ 30 if(in[i]<in[j]){//挑选最小的元素放入out中 31 out[k]=in[i++];//i∈[a,b]中的元素是最小的 32 }else{ 33 out[k]=in[j++];//j∈[b+1,c]中的元素是最小的 34 } 35 } 36 //遍历完之后,对剩余元素进行处理 37 int m=0,n=0; 38 boolean move=false; 39 if(i<=b){m=i;n=b;move=true;} //i∈[a,b]中的元素没有遍历完 40 if(j<=c){m=j;n=c;move=true;} //j∈[b+1,c]中的元素没有遍历完 41 for(i=m;i<=n && move;i++) out[k++]=in[i]; 42 for(i=a;i<=c;i++) in[i]=out[i];//临时数组放回原数组 43 44 int t; 45 t=0; 46 } 47 //递归函数 48 void MSort(int in[],int a,int b){//将[a,b]的元素进行排序 49 if(a!=b){ 50 int split=(a+b)/2; 51 MSort(in,a,split); 52 MSort(in,split+1,b); 53 merge(in,a,split,b);//栈底 54 } 55 } 56 MergeSort(int[] nums){ 57 MSort(nums,0,nums.length-1); 58 sortAns=nums; 59 } 60 MergeSort(){} 61 }
以上是关于归并排序 MergeSort的主要内容,如果未能解决你的问题,请参考以下文章