归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。 如 设有数列{6,202,100,301,38,8,1} 初始状态: [6] [202] [100] [301] [38] [8] [1] 比较次数 i=1 [6 202 ] [ 100 301] [ 8 38] [ 1 ] 3 i=2 [ 6 100 202 301 ] [ 1 8 38 ] 4 i=3 [ 1 6 8 38 100 202 301 ] 4 总计: 11次
新手。。表示看不懂这个意思。。麻烦哪位高手说说。。或写个代码来看看。百度那个看不懂。
新手。。表示看不懂这个意思。。麻烦哪位高手说说。。或写个代码来看看。百度那个看不懂。
分而治之(divide - conquer);每个递归过程涉及三个步骤
第一, 分解: 把待排序的 n 个元素的序列分解成两个子序列, 每个子序列包括 n/2 个元素.
第二, 治理: 对每个子序列分别调用归并排序MergeSort, 进行递归操作
第三, 合并: 合并两个排好序的子序列,生成排序结果.
看下老紫竹的~
/**
*
* @param arr
* 数组
*/
public void sort(int[] arr) {
int[] tmparr = new int[arr.length];// 备份数组
method(arr, tmparr, 0, arr.length - 1);
} /**
*
* @param arr
* 源数组
* @param tmparr
* 备份数组
* @param y
* 开始位置
* @param h
* 结束位置
*/
public void method(int[] arr, int[] tmparr, int y, int h) {
int mid = (y + h) / 2;
if (y == h) {
return;
}
method(arr, tmparr, y, mid);// 递归,把arr数组,分成每个都只含一个元素的数组
method(arr, tmparr, mid + 1, h);
for (int i = 0; i <= h; i++) {// 备份arr数组
tmparr[i] = arr[i];
}
int a1 = y;
int a2 = mid + 1;
for (int i = y; i <= h; i++) {
if (a1 == mid + 1) {// 只有后部分
arr[i] = tmparr[a2++];
} else if (a2 > h) {// 只有前面部分
arr[i] = tmparr[a1++];
} else if (tmparr[a1] < tmparr[a2]) {// 小的复制到前面
arr[i] = tmparr[a1++];
} else {
arr[i] = tmparr[a2++];
}
}
} public static void main(String[] args) {
Guibing g = new Guibing();
int[] data = { 1, 8, 6, 4, 7, 3, 9 };
g.sort(data);
for (int tmp : data) {
System.out.print(tmp + " ");
}
System.out.println();
}
}
这个写的很简单吧,不是很难理解