![](/img/trans.png)
[英]What am I doing wrong here with the selection sort. Keeps giving me issues about the type
[英]Have a sort of working Merge Sort, but not quite, could someone tell me what I am doing wrong?
首先,我想从我的方法背后的推理开始。 我的想法是,我将输入偶数或奇数的数组。 该数组将分解为原始数组长度的2D数组,每个索引的大小为1。 然后,我将继续将索引合并在一起。 这适用于长度为2、4、8、16的长度。现在,由于3、5、6、7无效,我不得不稍微修改一下方法。 现在,我的问题是即使它们起作用,但并非所有情况都起作用。 例如,长度25不能正确返回。 下面是我的代码:
/**
* A method to perform a merge sort
* @param array The array being fed in
*/
public static int[] mergeSort(int[] array)
{
if (array.length == 1)
{
return array;
}
int size = array.length;
int[][] miniArrayList = new int[size][1];
for (int index = 0; index < array.length; index++)
{
miniArrayList[index][0] = array[index];
}
while (miniArrayList.length > 1)
{
if (miniArrayList.length % 2 == 0)
{
miniArrayList = mergeEven(miniArrayList);
}
else
{
miniArrayList[0] = mergeOdd(miniArrayList);
}
}
return miniArrayList[0];
}
对于上述方法,我的想法是先输入一个数组,将其分解,然后一点一点地合并该数组,直到获得大小为1的排序数组为止。上面的方法调用以下方法:
private static int[][] mergeEven(int[][] array)
{
int[][] tempSortList = new int[array.length / 2][];
int tempIndex = 0;
for (int index = 0; index < array.length; index += 2)
{
tempSortList[tempIndex] = merge(array[index], array[index + 1]);
if (tempIndex != tempSortList.length)
{
tempIndex++;
}
}
array = tempSortList;
return array;
}
private static int[] mergeOdd(int[][] array)
{
/**
* The concept is to call the even merge method on the even part
* of the list and then once I get to one array, I merge that array
* with the extra array.
*/
int[][] localArray = new int[array.length - 1][1];
int[][] extra = new int[1][1];
for (int index = 0; index < localArray.length; index++)
{
localArray[index][0] = array[index][0];
}
extra[0][0] = array[array.length - 1][0];
int[][] tempSortList = new int[localArray.length / 2][];
int tempIndex = 0;
for (int index = 0; index < localArray.length; index += 2)
{
tempSortList[tempIndex] = merge(localArray[index], localArray[index + 1]);
if (tempIndex != tempSortList.length)
{
tempIndex++;
}
}
localArray = tempSortList;
return localArray[0] = merge(localArray[0], extra[0]);
}
这很容易说明,但以防万一。 由于数组为奇数或偶数,因此上述方法的排序方式有所不同。 最后,这些方法称为实际的合并方法(我认为这种方法有效):
/**
* A merge method to merge smaller arrays to bigger
* arrays
* @param arrayOne The first array being fed in
* @param arrayTwo The second array being fed in
* @return A new integer array which is the sum of the
* length of the two arrays
*/
private static int[] merge(int[] arrayOne, int[] arrayTwo)
{
/*
* To make a proper method that deals with odd array sizes
* look into seeing if it odd, only merging length of the array -1
* and then once that is all merged merge that array with the last part of the array
*/
//Creating the size of the new subarray
int[] mergedArray;
if (arrayOne.length % 2 == 0 && arrayTwo.length % 2 == 0)
{
int size = arrayOne.length;
int doubleSize = 2 * size;
mergedArray = new int[doubleSize];
//Positions of each array
int posOne = 0;
int posTwo = 0;
int mergeIndex = 0;
while (posOne < size && posTwo < size)
{
if (arrayOne[posOne] < arrayTwo[posTwo])
{
mergedArray[mergeIndex] = arrayOne[posOne];
mergeIndex++;
posOne++;
}
else
{
mergedArray[mergeIndex] = arrayTwo[posTwo];
mergeIndex++;
posTwo++;
}
}
if (posOne == size)
{
for (int rest = posTwo; rest < size; rest++)
{
mergedArray[mergeIndex] = arrayTwo[rest];
mergeIndex++;
}
}
else
{
for (int rest = posOne; rest < size; rest++)
{
mergedArray[mergeIndex] = arrayOne[rest];
mergeIndex++;
}
}
}
else
{
int arrayOneSize = arrayOne.length;
int arrayTwoSize = arrayTwo.length;
int newArraySize = arrayOneSize + arrayTwoSize;
mergedArray = new int[newArraySize];
//Position in each array
int posOne = 0;
int posTwo = 0;
int mergeIndex = 0;
while (posOne < arrayOneSize && posTwo < arrayTwoSize)
{
if (arrayOne[posOne] < arrayTwo[posTwo])
{
mergedArray[mergeIndex] = arrayOne[posOne];
mergeIndex++;
posOne++;
}
else
{
mergedArray[mergeIndex] = arrayTwo[posTwo];
mergeIndex++;
posTwo++;
}
}
if (posOne == arrayOneSize)
{
mergedArray[mergeIndex] = arrayTwo[posTwo];
mergeIndex++;
}
else
{
for (int rest = posOne; rest < arrayOneSize; rest++)
{
mergedArray[mergeIndex] = arrayOne[rest];
mergeIndex++;
}
}
}
return mergedArray;
}
所以我的问题是,无论我正确输入任何数组大小,它都只能在某些大小上工作。 我已经阅读了一些文章,但是我的实现方式与大多数我所看到的完全不同,这就是我在此处发布的原因。 我不想只复制工作正常的文件,而是想了解我做错了什么,以便可以解决。 在此先感谢您的帮助!
您的问题在于merge
的逻辑。 通过使用线
int size = arrayOne.length;
您假设两个数组的长度相同。 但是,在不均匀的情况下,并非所有阵列都具有相同的长度。
将其更改为两个不同的大小,代码应该没问题。
您更大的问题是您的算法过于复杂,更不用说对于大型数组而言效率低下。
我假设您是在进行学术活动,但是只要您能正常工作,请查看java.util.Arrays.mergeSort(私有方法)作为示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.