我正在编码Java中的非递归合并排序算法0我必须确定此方法是否作为非递归以及空间复杂度应该是O(N )非递归O(N)空间合并排序
指令我得到了:您可以使用O(N)空间(除了输入数组),并且您的算法应该具有与递归合并排序相同的运行时间。
这是我的代码。
我想确保递归以及O(N)空间 如果有更好的方法,请让我知道。
private static void merge(Integer[] a, Integer[] tmpArray, int leftPos, int rightPos, int rightEnd) {
int leftEnd = rightPos - 1;
int tmpPos = leftPos;
int numElements = rightEnd - leftPos + 1;
// Main loop
while(leftPos <= leftEnd && rightPos <= rightEnd) {
if(a[leftPos] <= a[rightPos ]) {
tmpArray[tmpPos++] = a[leftPos++];
} else {
tmpArray[tmpPos++] = a[rightPos++];
}
}
while(leftPos <= leftEnd) { // Copy rest of first half
tmpArray[tmpPos++] = a[leftPos++];
}
while(rightPos <= rightEnd) { // Copy rest of right half
tmpArray[tmpPos++] = a[rightPos++];
}
// Copy tmpArray back
for(int i = 0; i < numElements; i++, rightEnd--) {
a[rightEnd] = tmpArray[rightEnd];
}
}
public static void mergeSortB(Integer[] inputArray) {
Integer[] tempArray = new Integer[inputArray.length];
for(int i = 1; i<inputArray.length; i=i*2) {
for(int j=i; j<inputArray.length; j=j+i*2) {
int k = j+i-1;
if(inputArray.length<j + i) {
k = inputArray.length -1;
}
//call the merge method(non recursive)
merge(inputArray, tempArray, j-i,j, k);
}
}
}
你是什么意思O(n)?合并排序的时间复杂度为O(NlogN)。 –
我收到了教授的指令 您可以使用O(N)空间(除输入数组外),并且您的算法应该具有与递归合并排序相同的运行时间。 我不确定这是什么意思。我认为这个方法应该是bigO(N),但也许不是。 –
您可以尝试非基于比较的算法:https://www.cs.bgu.ac.il/~ds132/wiki.files/ds132_ps11.pdf –