归并算法的实现
2015-04-15 14:11
120 查看
public class Test {
public static void main(String[] args) {
int[] intArr = { 267, 66, 12, 7, 90, 7, 789, 54, 54, 456, 45654, 0, 345 };
int count = intArr.length;
for (int i = 0; i < intArr.length - 1; i += 2) {
if (intArr[i] > intArr[i + 1]) {
int temp = intArr[i];
intArr[i] = intArr[i + 1];
intArr[i + 1] = temp;
}
}
// 2个有序数组,共合并1次
// 3个有序数组,共合并2次
// 4个有序数组,共合并3次
int mergeCount = count / 2 + count % 2; // 第一次分割的数组个数
for (int i = 0; i < mergeCount - 1; i++) {
int startPos = i * 2 + 2;
int endPos = i * 2 + 4;
if (i == mergeCount - 2) { // 最后一个数组的处理,最后一个数组可能只有一个元素,或两个元素。
if (intArr.length % 2 != 0) {
endPos = i * 2 + 3;
}
}
int[] temp = mergeSort(Arrays.copyOfRange(intArr, 0, startPos),
Arrays.copyOfRange(intArr, startPos, endPos));
for (int j = 0; j < temp.length; j++) {
intArr[j] = temp[j];
}
}
for (int i = 0; i < intArr.length; i++) {
System.out.print(intArr[i] + " ");
}
}
public static int[] mergeSort(int[] intArr1, int[] intArr2) {
int[] allArr = new int[intArr1.length + intArr2.length];
for (int index1 = 0, index2 = 0, allIndex = 0;;) {
if (intArr1[index1] > intArr2[index2]) {
allArr[allIndex++] = intArr2[index2++];
} else if (intArr1[index1] < intArr2[index2]) {
allArr[allIndex++] = intArr1[index1++];
} else {
allArr[allIndex++] = intArr1[index1++];
allArr[allIndex++] = intArr2[index2++];
}
// 1.当数组一遍历完成,数组二还没有遍历完成
if (isCopyArray(intArr1, index1, intArr2, index2)) {
copyArray(intArr2, index2, allArr, allIndex);
break;
}
// 2.当数组二遍历完成,数组一还没有遍历完成
if (isCopyArray(intArr2, index2, intArr1, index1)) {
copyArray(intArr1, index1, allArr, allIndex);
break;
}
}
return allArr;
}
public static boolean isCopyArray(int[] arr1, int index1, int arr2[],
int index2) {
if (index1 >= arr1.length && index2 < arr2.length)
return true;
else
return false;
}
public static void copyArray(int[] fromArr, int fromIndex, int[] toArr,
int allIndex) {
for (int i = fromIndex; i < fromArr.length; i++) {
toArr[allIndex++] = fromArr[fromIndex++];
}
}
}
//-------------------------------------------------------------------------------------------------------
总结:(1)根据原理实现了归并排序了,对比一下标准的,显得比较复杂。
(2)这里有几个地方思考的,就是会产生很多的临时的数组,应该如何处理比较好。
(3)归并的策略是咋样的,还有就是归并有序数组的次数。自己通过简单的实验得出归并的次数的,
想出这样子的归并方法,是因为想确定一下归并的次数,感觉这样子很容确定归并的次数了。
(4)经过自己的思考得出来的,实现了,但是比较起来标准的,差了很多,但也收获很多。
public static void main(String[] args) {
int[] intArr = { 267, 66, 12, 7, 90, 7, 789, 54, 54, 456, 45654, 0, 345 };
int count = intArr.length;
for (int i = 0; i < intArr.length - 1; i += 2) {
if (intArr[i] > intArr[i + 1]) {
int temp = intArr[i];
intArr[i] = intArr[i + 1];
intArr[i + 1] = temp;
}
}
// 2个有序数组,共合并1次
// 3个有序数组,共合并2次
// 4个有序数组,共合并3次
int mergeCount = count / 2 + count % 2; // 第一次分割的数组个数
for (int i = 0; i < mergeCount - 1; i++) {
int startPos = i * 2 + 2;
int endPos = i * 2 + 4;
if (i == mergeCount - 2) { // 最后一个数组的处理,最后一个数组可能只有一个元素,或两个元素。
if (intArr.length % 2 != 0) {
endPos = i * 2 + 3;
}
}
int[] temp = mergeSort(Arrays.copyOfRange(intArr, 0, startPos),
Arrays.copyOfRange(intArr, startPos, endPos));
for (int j = 0; j < temp.length; j++) {
intArr[j] = temp[j];
}
}
for (int i = 0; i < intArr.length; i++) {
System.out.print(intArr[i] + " ");
}
}
public static int[] mergeSort(int[] intArr1, int[] intArr2) {
int[] allArr = new int[intArr1.length + intArr2.length];
for (int index1 = 0, index2 = 0, allIndex = 0;;) {
if (intArr1[index1] > intArr2[index2]) {
allArr[allIndex++] = intArr2[index2++];
} else if (intArr1[index1] < intArr2[index2]) {
allArr[allIndex++] = intArr1[index1++];
} else {
allArr[allIndex++] = intArr1[index1++];
allArr[allIndex++] = intArr2[index2++];
}
// 1.当数组一遍历完成,数组二还没有遍历完成
if (isCopyArray(intArr1, index1, intArr2, index2)) {
copyArray(intArr2, index2, allArr, allIndex);
break;
}
// 2.当数组二遍历完成,数组一还没有遍历完成
if (isCopyArray(intArr2, index2, intArr1, index1)) {
copyArray(intArr1, index1, allArr, allIndex);
break;
}
}
return allArr;
}
public static boolean isCopyArray(int[] arr1, int index1, int arr2[],
int index2) {
if (index1 >= arr1.length && index2 < arr2.length)
return true;
else
return false;
}
public static void copyArray(int[] fromArr, int fromIndex, int[] toArr,
int allIndex) {
for (int i = fromIndex; i < fromArr.length; i++) {
toArr[allIndex++] = fromArr[fromIndex++];
}
}
}
//-------------------------------------------------------------------------------------------------------
总结:(1)根据原理实现了归并排序了,对比一下标准的,显得比较复杂。
(2)这里有几个地方思考的,就是会产生很多的临时的数组,应该如何处理比较好。
(3)归并的策略是咋样的,还有就是归并有序数组的次数。自己通过简单的实验得出归并的次数的,
想出这样子的归并方法,是因为想确定一下归并的次数,感觉这样子很容确定归并的次数了。
(4)经过自己的思考得出来的,实现了,但是比较起来标准的,差了很多,但也收获很多。
public class Test { public static void main(String[] args) { int[] intArr = { 267, 66, 12, 7, 90, 7, 789, 54, 54, 456, 45654, 0, 345 }; int count = intArr.length; for (int i = 0; i < intArr.length - 1; i += 2) { if (intArr[i] > intArr[i + 1]) { int temp = intArr[i]; intArr[i] = intArr[i + 1]; intArr[i + 1] = temp; } } // 2个有序数组,共合并1次 // 3个有序数组,共合并2次 // 4个有序数组,共合并3次 int mergeCount = count / 2 + count % 2; // 第一次分割的数组个数 for (int i = 0; i < mergeCount - 1; i++) { int startPos = i * 2 + 2; int endPos = i * 2 + 4; if (i == mergeCount - 2) { // 最后一个数组的处理,最后一个数组可能只有一个元素,或两个元素。 if (intArr.length % 2 != 0) { endPos = i * 2 + 3; } } int[] temp = mergeSort(Arrays.copyOfRange(intArr, 0, startPos), Arrays.copyOfRange(intArr, startPos, endPos)); for (int j = 0; j < temp.length; j++) { intArr[j] = temp[j]; } } for (int i = 0; i < intArr.length; i++) { System.out.print(intArr[i] + " "); } } public static int[] mergeSort(int[] intArr1, int[] intArr2) { int[] allArr = new int[intArr1.length + intArr2.length]; for (int index1 = 0, index2 = 0, allIndex = 0;;) { if (intArr1[index1] > intArr2[index2]) { allArr[allIndex++] = intArr2[index2++]; } else if (intArr1[index1] < intArr2[index2]) { allArr[allIndex++] = intArr1[index1++]; } else { allArr[allIndex++] = intArr1[index1++]; allArr[allIndex++] = intArr2[index2++]; } // 1.当数组一遍历完成,数组二还没有遍历完成 if (isCopyArray(intArr1, index1, intArr2, index2)) { copyArray(intArr2, index2, allArr, allIndex); break; } // 2.当数组二遍历完成,数组一还没有遍历完成 if (isCopyArray(intArr2, index2, intArr1, index1)) { copyArray(intArr1, index1, allArr, allIndex); break; } } return allArr; } public static boolean isCopyArray(int[] arr1, int index1, int arr2[], int index2) { if (index1 >= arr1.length && index2 < arr2.length) return true; else return false; } public static void copyArray(int[] fromArr, int fromIndex, int[] toArr, int allIndex) { for (int i = fromIndex; i < fromArr.length; i++) { toArr[allIndex++] = fromArr[fromIndex++]; } } }
相关文章推荐
- 白话经典算法系列之五 归并排序的实现
- 白话经典算法系列之五 归并排序的实现
- 【转载】白话经典算法系列之五 归并排序的实现
- Java实现的排序算法及比较 [冒泡,选择,插入,归并,希尔,快排]
- 合并(归并)排序 算法原理与实现
- 8大内部排序算法学习笔记--(4)归并、基数排序 Java实现
- 二路归并算法的实现
- 归并排序的算法实现
- 通用类型的两路归并算法实现(二)——面向接口实现通用类型的两路归并
- 白话经典算法系列之五 归并排序的实现
- 白话经典算法系列之五 归并排序的实现
- 归并算法的实现
- 白话经典算法系列之五 归并排序的实现
- 用友面试题答案 - java归并算法实现
- 归并排序的算法实现
- 白话经典算法系列之五 归并排序的实现
- 算法代码实现之归并排序,C/C++实现,自顶向下与自底向上两种方式
- 二路归并算法的实现方法,用到vector容器
- 《算法》第二章——归并排序实现,快速归并,间接(索引)归并
- 二路归并算法非递归C实现