1.何为归并排序
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
2.图解
3.具体步骤
第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置重复步骤3直到某一指针超出序列尾将另一序列剩下的所有元素直接复制到合并序列尾
4.代码分析
4.1
设定两个指针,最初位置分别为两个已经排序序列的起始位置
public static void merge(int[] arr,int L,int mid,int R){
int[] help=new int[R-L+1];//辅助数组
int i=0; //辅助数组下标
int p1=L; //p1是个下标,相当于左侧指针
int p2=mid+1; //p2...............右侧...
while(p1<=mid&& p2<=R){
help[i++]=arr[p1]<arr[p2]?arr[p1++]:arr[p2++];//比大小,谁小填进辅助数组,然后辅助数组下标移动,小数下标移动
}
while(p1<=mid){
help[i++]=arr[p1++];//p2越界,直接把p1的数移动过来
}
while (p2<=R){
help[i++]=arr[p2++];//p1越界,把p2的数移动过来
}
for(i=0;i<help.length;i++){
arr[L+i]=help[i];//拷贝
}
}
4.2如何利用递归排序左右两部分:
public static void sortProcess(int[] arr,int L,int R){
if(L==R){
return;
}
int mid =L+(R-L)/2;
sortProcess(arr,L,mid);
sortProcess(arr,mid+1,R);//递归过程,左边右边分别排好序
merge(arr,L,mid,R);
}
4.3 整体排序
public static void mergeSort(int[] arr){
if(arr==null||arr.length<2){
return;
}
sortProcess(arr,0,arr.length-1);
}
测试:
public static void main(String[] args) {
int[] arr={1,3,32,2,55,21};
mergeSort(arr);
for (int i:arr){
System.out.print(i+",");
}
}
输出: