合并排序实现/递归调用或合并时怀疑错误
Merge-Sort implementation / suspecting mistake in recursive call or while merging
感谢任何帮助解决这个问题的人。这里的任务是对不为零的整数数组进行排序。我想我犯了两个我无法解决的错误。
首先:我想我在递归调用时犯了一个错误。合并时边界似乎设置错误
其次:我也觉得排序过程也有几个错误
static void mergeSort(int[] init, int lower, int upper) {
if (lower < upper) {
int mid = (lower + upper) / 2;
mergeSort(init, lower, mid);
mergeSort(init, mid+1, upper);
merge(init, lower, mid, upper);
}
}
static void merge(int[] init, int lower, int mid, int upper) {
int length1 = mid - lower; //length of first subarray
int length2 = upper - mid; //length of second subarray
int[] leftArray = new int[length1+1]; //creating left subArray
int[] rightArray = new int[length2+1]; //creating right subArray
for (int i = 0; i < length1; i++) { //copying positions from left partition to left subArray
leftArray[i] = init[lower + i];
}
for (int i = 0; i < length2; i++) { //copying positions from right partition to right subArray
rightArray[i] = init[mid+i];
}
int i = 0; //sorting
int j = 0;
for (int k = lower; k < upper; k++) {
if (leftArray[i] <= rightArray[j]) {
init[k] = leftArray[i];
i++;
} else {
init[k] = rightArray[j];
j++;
}
}
}
这不是使用静态方法逐步执行合并排序的推荐方法吗:
public static void mergeSort(int[] init, int arrayLength) {
if (arrayLength < 2) {
return;
}
int mid = arrayLength / 2;
int[] left = new int[mid];
int[] right = new int[arrayLength - mid];
for (int i = 0; i < mid; i++) {
left[i] = init[i];
}
for (int i = mid; i < arrayLength; i++) {
right[i - mid] = init[i];
}
mergeSort(left, mid);
mergeSort(right, arrayLength - mid);
merge(init, left, right, mid, arrayLength - mid);
}
public static void merge(
int[] init, int[] left, int[] right, int leftLength, int rightLength) {
int i = 0, j = 0, k = 0;
while (i < leftLength && j < rightLength) {
if (left[i] <= right[j]) {
init[k++] = left[i++];
}
else {
init[k++] = right[j++];
}
}
while (i < leftLength) {
init[k++] = left[i++];
}
while (j < rightLength) {
init[k++] = right[j++];
}
}
调用“mergeSort”,第一个参数是要排序的数组,第二个参数是它的长度。
干杯!
感谢任何帮助解决这个问题的人。这里的任务是对不为零的整数数组进行排序。我想我犯了两个我无法解决的错误。
首先:我想我在递归调用时犯了一个错误。合并时边界似乎设置错误
其次:我也觉得排序过程也有几个错误
static void mergeSort(int[] init, int lower, int upper) {
if (lower < upper) {
int mid = (lower + upper) / 2;
mergeSort(init, lower, mid);
mergeSort(init, mid+1, upper);
merge(init, lower, mid, upper);
}
}
static void merge(int[] init, int lower, int mid, int upper) {
int length1 = mid - lower; //length of first subarray
int length2 = upper - mid; //length of second subarray
int[] leftArray = new int[length1+1]; //creating left subArray
int[] rightArray = new int[length2+1]; //creating right subArray
for (int i = 0; i < length1; i++) { //copying positions from left partition to left subArray
leftArray[i] = init[lower + i];
}
for (int i = 0; i < length2; i++) { //copying positions from right partition to right subArray
rightArray[i] = init[mid+i];
}
int i = 0; //sorting
int j = 0;
for (int k = lower; k < upper; k++) {
if (leftArray[i] <= rightArray[j]) {
init[k] = leftArray[i];
i++;
} else {
init[k] = rightArray[j];
j++;
}
}
}
这不是使用静态方法逐步执行合并排序的推荐方法吗:
public static void mergeSort(int[] init, int arrayLength) {
if (arrayLength < 2) {
return;
}
int mid = arrayLength / 2;
int[] left = new int[mid];
int[] right = new int[arrayLength - mid];
for (int i = 0; i < mid; i++) {
left[i] = init[i];
}
for (int i = mid; i < arrayLength; i++) {
right[i - mid] = init[i];
}
mergeSort(left, mid);
mergeSort(right, arrayLength - mid);
merge(init, left, right, mid, arrayLength - mid);
}
public static void merge(
int[] init, int[] left, int[] right, int leftLength, int rightLength) {
int i = 0, j = 0, k = 0;
while (i < leftLength && j < rightLength) {
if (left[i] <= right[j]) {
init[k++] = left[i++];
}
else {
init[k++] = right[j++];
}
}
while (i < leftLength) {
init[k++] = left[i++];
}
while (j < rightLength) {
init[k++] = right[j++];
}
}
调用“mergeSort”,第一个参数是要排序的数组,第二个参数是它的长度。
干杯!