我目前正在使用Java进行算法开发,最近真的陷入了一个特定的问题。我面临开发两个不同算法的挑战。
我的任务是解决选择问题。选择问题决定了N个数字中第k个最大的数字。
我已经成功实现了第一个算法。我将N个数字读入数组,通过某种简单算法对数组进行降序排序,然后将元素返回到位置k。
注意:k = N / 2
这是工作代码
public int selectionAlgorithmOne() {
int[] intArray = new int[]{1, 7, 9, 8, 2, 3, 5, 4, 6, 10};
//I sort the array of size N in decreasing order
bubbleSortDecreasingOrder(intArray);
//{10, 9, 8, 7, 6, 5, 4, 3, 2, 1}
//I obtain the value of k
int k = intArray.length / 2;
//I print the result
System.out.println(intArray[k]);
}
在“ 5 ”中打印的值是正确的!但是,第二种算法有点棘手。
将前k个元素读入数组,并以降序对其进行排序。接下来,每个剩余的元素被一个一个地读取。当新元素到达时,如果它小于数组中的第k个元素,则将其忽略。否则,它将放置在阵列中的正确位置,从而将一个元素从阵列中撞出。算法结束后,将返回第k个位置的元素作为答案。
不幸的是,我的第二个算法不起作用。它返回错误的值“ 3 ”。它应该返回与第一个算法相同的“ 5 ”值,但效率更高。
我已经被困了几天,我真的很难找到解决方案。希望我已经为问题提供了足够的背景信息,让我知道是否可以提供更多信息。预先感谢。
这是无效代码
public int selectionAlgorithmTwo() {
int[] intArray = new int[]{1, 7, 9, 8, 2, 3, 5, 4, 6, 10};
int arrayLength = intArray.length;
int k = arrayLength / 2;
int[] firstHalf = new int[k];
//I read the first half of the elements into an array
for (int i = 0; i < k; i++) {
firstHalf[i] = intArray[i];
}
//I then sort the first half of the elements in decreasing order
bubbleSort(firstHalf);
for(int i = k; i < arrayLength; i++) {
int val = intArray[i];
//If the new element to insert is >= the kth largest
if (val > firstHalf[k - 1]) {
int pos = 0;
for(; pos < k; pos++) {
if(val > firstHalf[pos]) {
break; //I break once I have the correct position located
}
//I make the swap
for (int j = k - 1; j > pos; j--)
firstHalf[j] = firstHalf[j - 1];
firstHalf[pos] = val;
}
}
}
return firstHalf[k - 1];
}
答案 0 :(得分:0)
您正在将未排序部分的值与已排序部分的值进行比较,从低位开始,即从小值开始。该值大于第一个排序的值的可能性非常高。更有趣的是较小的值。根据您的算法,较小的未排序值应在替换较高值(而不是较小值)的位置插入较小排序值中。
所以
total_height = tf.convert_to_tensor(ymax_int - ymin_int, dtype=tf.int32)
total_width = tf.convert_to_tensor(xmax - xmin, dtype=tf.int32)
ymin = tf.convert_to_tensor(ymin, dtype=tf.int32)
xmin = tf.convert_to_tensor(xmin, dtype=tf.int32)
应该是
if(val > firstHalf[pos])
答案 1 :(得分:0)
首先,“位置k中的元素”不是第k个元素,而是第k + 1个元素。确实 5 是排序数组的第六个元素。
因此,如果要返回位置k的元素,则需要一个k + 1个元素的数组。
因此,我添加了firstHalfLen
变量。
如果使用k个元素数组,则永远不会得到 5 作为答案。
在块if (val > firstHalf[k])
中,为了找到正确的索引,我更喜欢使用while循环
while ((pos < firstHalfLen) && (val <= firstHalf[pos])) {
pos++;
}
然后交换:
for (int j = k; j > pos; j--) {
firstHalf[j] = firstHalf[j - 1];
}
代码:
int[] intArray = new int[] { 1, 7, 9, 8, 2, 3, 5, 4, 6, 10 };
int arrayLength = intArray.length;
int k = arrayLength / 2;
int firstHalfLen = k + 1;
int[] firstHalf = new int[firstHalfLen];
// I read the first half of the elements into an array
for (int i = 0; i < firstHalfLen; i++) {
firstHalf[i] = intArray[i];
}
//I then sort the first half of the elements in decreasing order
bubbleSort(firstHalf);
for (int i = firstHalfLen; i < arrayLength; i++) {
int val = intArray[i];
// If the new element to insert is >= the kth largest
if (val > firstHalf[k]) {
int pos = 0;
// find index
while ((pos < firstHalfLen) && (val <= firstHalf[pos])) {
pos++;
}
// Swap
for (int j = k; j > pos; j--) {
firstHalf[j] = firstHalf[j - 1];
}
firstHalf[pos] = val;
}
}
return firstHalf[k];
答案 2 :(得分:0)
尝试以下代码:
public int sortTest() {
int[] intArray = new int[]{1, 7, 9, 8, 2, 3, 5, 4, 6, 10};
int arrayLength = intArray.length;
int k = arrayLength / 2;
int[] firstHalf = new int[k];
//I read the first half of the elements into an array
for (int i = 0; i < k; i++) {
firstHalf[i] = intArray[i];
}
//I then sort the first half of the elements in decreasing order
bubbleSort(firstHalf);
for(int i = k; i < arrayLength; i++) {
int val = intArray[i];
//If the new element to insert is >= the kth largest
if (val > firstHalf[k - 1]) {
int pos = 0;
for(; pos < k; pos++) {
if(val > firstHalf[pos]) {
break; //I break once I have the correct position located
}
}
//I make the swap
for (int j = k - 1; j > pos; j--)
firstHalf[j] = firstHalf[j - 1];
firstHalf[pos] = val;
}
}
return firstHalf[k - 1];
}
您的代码中的错误是,找到正确的位置和中断后,您将退出for循环而没有交换过程。
还要注意,此代码返回6,而不是5,因为您返回了第k-1个值。