算法的概念
归并排序:是创建在归并操作上的一种有效的排序算法。算法是采用分治法的一个非常典型的应用,且各层分治递归可以同时进行。归并排序思路简单,速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。(分成左右两个区间,左侧0-mid 右侧mid+!)
算法的步骤
1 申请空间,使其大小为两个已排序序列之和,该空间用来存放合并后的序列。
2 设定两个指针,最初位置分别为两个已经排序序列的起始位置
(左侧数组起始元素,右侧数组起始元素)
3 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到移到下一位置。
4 重复步骤3直到某一指针达到序列尾
5 将另一序列剩下的所有元素直接复制到合并序列尾。
代码示例
public static int[] mergeSort(int[] nums,int l,int h){ //数组,起始索引,结束索引 if(l==h)//起始索引与结束索引相等,说明这个数组的长度为1,直接返回即可 return new int[](nums[l]); int mid=(1+h)/2;//中间值 int[] leftArr=mergeSort(nums,l,mid); //递归调用自己,获取排好序的左数组 int[] rightArr=mergeSort(nums,mid+1,h); int m=0,i=0,j=0; //新数组的指针,做数组,有数组的指针 while(i<leftArr.length&&j<rightArr.length){ newNum[m++]=leftArr[i]<rightArr[j]?leftArr[i++]:rightArr[j++]; // } while(i<leftArr.length) newNum[m++]=leftArr[i++]; //左数组存在剩余 while(j<rightArr.length) newNum[m++]=rightArr[j++]; return newNum; //右数组存在剩余 //最后返回新数组 }
例题实战(实现升序,与前面几章的实战题目相同)
package AAA; import java.util.*; public class Art { public static void main(String args[]) { Scanner scanner =new Scanner(System.in); int n=scanner.nextInt(); int []arr=new int [n]; for(int i=0;i<n;i++) { arr[i]=scanner.nextInt(); } arr=mergesort(arr,0,n-1); for(int i=0;i<n;i++) { System.out.print(arr[i]+" "); } } public static int []mergesort(int []arr,int l,int h){ if(l==h) { return new int[] {arr[l]}; } int mid=(l+h)/2; int []left=mergesort(arr,l,mid); int []right=mergesort(arr,mid+1,h); int []nums=new int [left.length+right.length]; int i=0,j=0,m=0; while(i<left.length&&j<right.length) { nums[m++]=left[i]<right[j]?left[i++]:right[j++]; } while(i<left.length) { nums[m++]=left[i++]; } while(j<right.length) { nums[m++]=right[j++]; } return nums; } }