Java算法系列篇
什么? 搞Java不会算法?
由于个人兴趣原因以及工作所需,最近了解Java算法的相关案例
及时分享 感兴趣的欢迎交流
并归排序
描述:
归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列
分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
展示
如果还是不明白 请看图
动图展示
代码浏览
因为我分开方法写的, 代码较多 一张图截不下来,所以分开图①图②
代码①
代码②
代码自测
public static void main(String[] args) {
// 无序数组
int[] arr = {1, 8, 2, 6, 7, 3, 9};
JavaAlgorithm2 javaAlgorithm2 = new JavaAlgorithm2();
//并归排序
javaAlgorithm2.mergeSort(arr);
}
/**
* 并归排序
* [@param](https://my.oschina.net/u/2303379) arr 待排序数组
*/
private void mergeSort(int[] arr) {
JavaAlgorithm2.sort(arr, 0, arr.length - 1);
//展示排序结果
System.out.println("排序后:"+Arrays.toString(arr));
}
/**
* 排序
* [@param](https://my.oschina.net/u/2303379) arr
* [@param](https://my.oschina.net/u/2303379) left
* [@param](https://my.oschina.net/u/2303379) right
*/
private static void sort(int[] arr, int left, int right) {
if (left >= right)
return;
//找出中间索引
int center = (left + right) / 2;
// 对左边数组进行递归
sort(arr, left, center);
// 对右边数组进行递归
sort(arr, center + 1, right);
// 合并
merge(arr, left, center, right);
}
/**
* 合并
* [@param](https://my.oschina.net/u/2303379) data 数组对象
* @param left 左数组的第一个元素的索引
* @param center 左数组的最后一个元素的索引,center+1 是右数组第一个元素的索引
* @param right 右数组最后一个元素的索引
*/
private static void merge(int[] data, int left, int center, int right) {
// 临时数组
int[] tempArr = new int[data.length];
// 右数组第一个元素索引
int mid = center + 1;
// third 纪录临时数组的索引
int third = left;
// 缓存左数组第一个元素的索引
int tmp = left;
while (left <= center && mid <= right) {
// 从两个数组中取出最小的放入临时数组
if (data[left] <= data[mid]) {
tempArr[third++] = data[left++];
} else {
tempArr[third++] = data[mid++];
}
}
// 剩余部分依次放入临时数组(实际上两个while只会执行其中一个)
while (mid <= right) {
tempArr[third++] = data[mid++];
}
while (left <= center) {
tempArr[third++] = data[left++];
}
// 将临时数组中的内容拷贝回原数组中
//(原left-right范围的内容被复制回原数组)
while (tmp <= right) {
data[tmp] = tempArr[tmp++];
}
//System.out.println(Arrays.toString(data));
}
代码稍微比别的排序多一点点,但是并归排序很容易理解,多结合看几遍动图和代码
初期可以拿去自己练习 熟悉之后可以灵活运用
希望同仁志士,前来参考以及指点!共同进步,发扬文化精神!转载请标明出处!