/**
* 排序算法学习之一般合并排序
* @author Sking
实现方法:
将待排序数组分为大小大致相等的2个子数组
分别对两个子数组进行排序,如此递归划分排序
最后将排序号的子数组再递归合并为更大的已排序数组
直到整个数组已排序为止。
*/
package 递归分治;
public class MergeSort2 {
/**
* 对指定数组的指定范围执行一般合并排序
*
* @param a
* 指定数组
* @param left
* 指定范围的左边索引
* @param right
* 指定范围的右边索引
*/
@SuppressWarnings("rawtypes")
public void mergeSort2(Comparable[] a, int left, int right) {
Comparable[] b = new Comparable[a.length];
if (left < right) {
int i = (left + right) / 2;
mergeSort2(a, left, i);
mergeSort2(a, i + 1, right);
merge(a, b, left, i, right);
copy(a, b, left, right);
}
}
/**
* 合并已排序子数组c[l...m]和c[m+1,r]到新数组中,新数组保持有序
*
* @param c存放两个已排序数组的数组
* @param d
* 新数组,用于存放合并后的数组
* @param l
* 左边子数组的起始索引
* @param m
* 左边子数组的结束索引
* @param r
* 右边子数组的结束索引
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
private static void merge(Comparable[] c, Comparable[] d, int l, int m,
int r) {
int i = l;
int j = m + 1;
int k = l;
while ((i <= m) && (j <= r))
if (c[i].compareTo(c[j]) <= 0)
d[k++] = c[i++];
else
d[k++] = c[j++];
if (i > m)
for (int q = j; q <= r; q++)
d[k++] = c[q];
else
for (int q = i; q <= m; q++)
d[k++] = c[q];
}
/**
* 复制源数组中指定索引范围内的元素到目标数组
*
* @param a
* 源数组
* @param b
* 目标数组
* @param left
* 指定范围的左边索引
* @param right
* 指定范围的右边索引
*/
@SuppressWarnings("rawtypes")
private static void copy(Comparable[] a, Comparable[] b, int left, int right) {
int i = left;
int j = left;
while (i <= right)
a[i++] = b[j++];
}
public static void main(String[] args) {
}
}
递归分治算法之合并排序算法2(Java版本)
最新推荐文章于 2020-08-18 10:16:12 发布