1、算法的概念
归并排序:是创建在归并操作上的一种有效的排序算法。算法是采用分治法的一个非常典型的应用,且各层分治递归可以同时进行。归并排序的思路简单,速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项目相对有序的数列。时间复杂度:O()
2、步骤
- 申请空间,使其大小为两个已经排序之和,该控件用来存放给合并后的序列
- 设定两个指针,最初位置分别为两个已经排序序列的起始位置
- 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
- 重复步骤3直到某一指针达到序列尾
- 将另一系列剩下的所有元素直接复制到合并序列尾
public static int[] mergeSort(int[] nums,int l,int h){if(l == h) {return new int[]{nums[l]};}int mid = (l + h) / 2;int[] leftArr = mergeSort(nums,l,mid);//左有序数组int[] rightArr = mergeSort(nums,mid+1,h);//右有序数组int[] newNum = new int[leftArr.length + rightArr.length];//新有序数组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;}
例题
https://www.lanqiao.cn/problems/3225/learning/
public class _05归并算法 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int[] arr = new int[n];for (int i = 0; i < n; i++) {arr[i] = sc.nextInt();}arr = mergeSort(arr,0,n-1);for (int x:arr){System.out.print(x + " ");}}public static int[] mergeSort(int[] nums,int l,int h){if(l == h) {return new int[]{nums[l]};}int mid = (l + h) / 2;int[] leftArr = mergeSort(nums,l,mid);//左有序数组int[] rightArr = mergeSort(nums,mid+1,h);//右有序数组int[] newNum = new int[leftArr.length + rightArr.length];//新有序数组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;}
}