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;
}
}