您的位置:首页 > 其它

归并算法的实现

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 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++];
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: