数组的后半部分没有为我排序,我似乎无法弄清楚原因。
这是我的代码
public static void sort(int[] a)
{
if(a.length >= 2)
{
int halfLength = a.length / 2;
int[] firstHalf = new int[halfLength];
int[] lastHalf = new int[a.length - halfLength];
divide(a, firstHalf, lastHalf);
sort(firstHalf);
sort(lastHalf);
merge(a, firstHalf, lastHalf);
}
}
private static void divide(int[] a, int[] firstHalf, int[] lastHalf)
{
for(int i = 0; i < firstHalf.length; i++)
{
firstHalf[i] = a[i];
}
for(int i = 0; i < lastHalf.length; i++)
{
lastHalf[i] = a[firstHalf.length + i];
}
}
private static void merge(int[] a, int[] firstHalf, int[] lastHalf)
{
int firstHalfIndex = 0, lastHalfIndex = 0, aIndex = 0;
while((firstHalfIndex < firstHalf.length) && (lastHalfIndex < lastHalf.length))
{
if(firstHalf[firstHalfIndex] < lastHalf[lastHalfIndex])
{
a[aIndex] = firstHalf[firstHalfIndex];
firstHalfIndex++;
}
else
{
a[aIndex] = lastHalf[firstHalfIndex];
lastHalfIndex++;
}
aIndex++;
while(firstHalfIndex < firstHalf.length)
{
a[aIndex] = firstHalf[firstHalfIndex];
aIndex++;
firstHalfIndex++;
}
while(lastHalfIndex < lastHalf.length)
{
a[aIndex] = lastHalf[lastHalfIndex];
aIndex++;
lastHalfIndex++;
}
}
}
我从一本教科书中得到了这一点,我知道我可以在网上找到更多示例,但我希望我可以先使它起作用。
输出:
Array values before sorting:
7 5 11 2 16 4 18 14 12 30
Array values after sorting:
2 5 7 11 16 4 18 12 14 30
预期产量:
Array values before sorting:
7 5 11 2 16 4 18 14 12 30
Array values after sorting:
2 4 5 7 11 12 14 16 18 30
谢谢您的帮助!
最佳答案
两个错误:lastHalf[firstHalfIndex]
中的复制粘贴错误,应为lastHalf[lastHalfIndex]
第一个while
循环不应跨越其他两个循环
已更正:
private static void merge (int[] a, int[] firstHalf, int[] lastHalf) {
int firstHalfIndex = 0, lastHalfIndex = 0, aIndex = 0;
while ((firstHalfIndex < firstHalf.length) && (lastHalfIndex < lastHalf.length)) {
if (firstHalf[firstHalfIndex] < lastHalf[lastHalfIndex]) {
a[aIndex] = firstHalf[firstHalfIndex];
firstHalfIndex++;
} else {
a[aIndex] = lastHalf[lastHalfIndex];
lastHalfIndex++;
}
aIndex++;
}
while (firstHalfIndex < firstHalf.length) {
a[aIndex] = firstHalf[firstHalfIndex];
aIndex++;
firstHalfIndex++;
}
while (lastHalfIndex < lastHalf.length) {
a[aIndex] = lastHalf[lastHalfIndex];
aIndex++;
lastHalfIndex++;
}
}