归并排序思想及java模板代码
Posted 知道什么是码怪吗?
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了归并排序思想及java模板代码相关的知识,希望对你有一定的参考价值。
归并排序思想:
①划分:将进入方法的数组划分为两部分
②递归:递归继续划分,直到个数为1
③合并:根据值的大小来合并,小的先放入合并的数组当中。
例如:1, 1, 7, 3, 4, 5, 9, 8, 3
一直递归到底层 划分为{ 1 , 1 } { 7 } { 3 , 4 } { 5 , 9 } { 8 , 3 }
合并{ 1 , 1 , 7 } { 3 , 4 } { 3 , 5 , 8 , 9 }
合并{ 1 , 1 , 3 , 4 , 7 } { 3 , 5 , 8 , 9 }
合并{ 1 , 1 , 3 , 3 , 4 , 5 , 7 , 8 , 9 }
但是程序不是这样执行的,是根据递归的顺序来合并的。
下面这个图形象生动:
归并排序模板代码(去掉注释和调试的代码也就20行左右):
package arithmetic;
//归并排序模板代码
//归并排序是稳定的
public abstract class MergeSort {
static int[] nums = { 1, 1, 7, 3, 4, 5, 9, 8, 3 };
static int[] result = new int[nums.length];
public static void merge_sort(int nums[], int left, int right) {
// 如果传过来的数组范围的两个下标的left>=right
// 说明了这个数组的只有1个数,不需要排序
if (left >= right)
return;
int mid = left + (right - left) / 2;// 防止溢出写法
merge_sort(nums, left, mid);// 一直递归取前一半数组
merge_sort(nums, mid + 1, right);// 前一半递归到不能再递归后对当前数组后一半递归直到只有一个数
// 下面这一个for循环可以用来看递归是如何划分数组的
// System.out.print("划分数组:");
// for (int count = left; count <= right; count++) {
// System.out.print(nums[count] + " ");
// }
// System.out.println();
int Index = 0;// 结果数组的下标
int i = left;// 左边数组的开始下标,左边是left到mid
int j = mid + 1;// 右边数组的开始下标,右边是mid+1到right
// 其实这里相当于每一次递归都会刷新result数组的值
while (i <= mid && j <= right) {// 将递归的左右数组合并,谁小就先放进去
if (nums[i] <= nums[j])
result[Index++] = nums[i++];
else
result[Index++] = nums[j++];
}
// 当某一个数组放完后,另一个数组直接放进去
while (i <= mid)
result[Index++] = nums[i++];
while (j <= right)
result[Index++] = nums[j++];
// 将合成的有序数组放回去,方便下次合并
// System.out.print("合并数组:");
for (i = left, j = 0; i <= right; i++, j++) {
nums[i] = result[j];
// System.out.print(result[j] + " ");//用于查看合并过后的数组
}
// System.out.println();
}
public static void main(String[] args) {
merge_sort(nums, 0, nums.length - 1);
System.out.print("排序结果:");
for (int i : result) {
System.out.print(i + " ");
}
}
}
以上是关于归并排序思想及java模板代码的主要内容,如果未能解决你的问题,请参考以下文章