归并排序
1.原理
归并排序是一种排序算法,它通过将待排序的数组或列表递归分割成较小的子数组,然后将这些子数组合并以生成一个有序的数组。
2.操作
- 分割(Divide):将待排序的数组分成两个大致相等的子数组,或者将列表分成两部分。这个过程是递归的,直到每个子数组或子列表都只包含一个元素为止。
- 合并(Merge):逐个合并两个有序的子数组(或子列表),以生成一个新的有序数组(或列表)。在合并过程中,通过比较两个子数组(或子列表)中的元素,将较小的元素放入新的有序数组(或列表),并继续这个过程,直到所有元素都合并为止。
- 递归:重复上述分割和合并过程,直到整个数组(或列表)都被排序为止。
3.演示
先递归分割,再逐步合并
4.代码
/**
* @param nums 待排序数组
* @param low 数组的开始元素索引
* @param high 数组的结束元素索引
* @return 升序排列的数组
*/
public int[] mergeSort(int[] nums, int low, int high) {
if (high - low <= 0) {
int[] ints = new int[1];
ints[0]=nums[low];
return ints;
}
int mid = (low + high) / 2;
int[] leftNums = mergeSort(nums, low, mid);
int[] rightNums = mergeSort(nums, mid+1, high);
int[] res = new int[leftNums.length+rightNums.length];
int li = 0, ri = 0, i = 0;
while (ri < rightNums.length && li < leftNums.length) {
if (leftNums[li] < rightNums[ri]) {
res[i] = leftNums[li];
li++;
i++;
} else {
res[i] = rightNums[ri];
ri++;
i++;
}
}
if (li == leftNums.length) {
while(ri<rightNums.length){
res[i] = rightNums[ri];
ri++;
i++;
}
}else{
while(li<leftNums.length){
res[i] = leftNums[li];
li++;
i++;
}
}
return res;
}
标签:归并,演示,int,合并,列表,数组,排序
From: https://www.cnblogs.com/lanailearn/p/17744503.html