【问题标题】:Finding the kth smallest element in an array using recursion?使用递归查找数组中的第 k 个最小元素?
【发布时间】:2015-10-18 05:38:47
【问题描述】:
#include <iostream>

using namespace std;

void moveToKthSmallest(int a[], int size, int k); 


int main() {

int theArray[17] = {42, 5, 412, 56, 14, 98, 488, 4882, 24, 4, 9, 67, 9424, 2, 1, 3, 5};
int num;

cout << "Move to the kth smallest number in the array (size of 17): " << endl;
cin >> num;
moveToKthSmallest(theArray, 17, num);


return 0;
}

void moveToKthSmallest(int a[], int size, int k) {
int pivot = size / 2;
int pivotValue = a[pivot];
int index1 = 0, index2 = 0;
int s1[size], s2[size]; //not sure about this


for (int i = 0; i < size; i++) {
    if (a[i] < pivotValue) {
        s1[index1] = a[i];
        index1++;
    }
    else {
        s2[index2] = a[i];
        index2++; 
    }
}

int s1Size = index1; //problem?
int s2Size = index2; //problem?

if (s1Size == k - 1) {
    cout << pivotValue;
}

else if (s1Size > (k - 1)) {
    moveToKthSmallest(s1, s1Size, k);
}

else if (s1Size < (k - 1)) {
    moveToKthSmallest(s2, s2Size, k - (s1Size - 1));
}
}

我要求用户输入一个数字(大于或等于 0 或小于或等于 17),程序应输出已生成数组中第 k 个最小的数字。

以上是我的尝试,但每当我运行它时它都会崩溃。我认为这与函数中数组 s1 和 s2 的声明以及可能从 index1 和 index2 生成的大小值有关。我尝试过使用向量和动态数组,但我的编译器中不断收到错误消息,例如“错误:无法将 'std::vector**' 转换为 'int*' for argument '1' to 'void moveToKthSmallest” .. . 老实说,我不太清楚这意味着什么。

我在这里遗漏了一些明显的东西吗?

【问题讨论】:

    标签: c++ arrays


    【解决方案1】:

    第一个问题是它被标记为 C++ 而不是 C。因此,您应该使用简单的 std::vector&lt;int&gt; 而不是 int a[]int size

    现在,在您的示例中,您将在每次递归时迭代整个数组。

    第二点,我不明白为什么这里甚至需要递归。只需对数组进行一次迭代即可找到答案。

    最简单的方法是使用第二个数组,比如std::vector&lt;int&gt; smallest,然后只遍历一次std::vector&lt;int&gt; a

    遍历每个元素时:

    • 如果smallest.size()已经是k,并且当前值大于smallest中的最后一个值,则继续a中的下一个值,否则删除@987654330中的最后一个值@。

    • 1234563 /p>

    在迭代结束时,smallest 向量中的最后一个值是原始向量中的第 k 个最小值。

    如果你想知道第k个最小值的位置,这只是对上述算法的一个小修改,通过跟踪smallest向量中的位置,而不是值。

    这似乎是一个更简单、直接的解决方案,然后是一个复杂的基于递归的方法,具有令人困惑的旋转操作。此外,您的旋转示例需要修改原始数组,而我的方法不需要,甚至可以与 const std::vector&lt;int&gt; 一起使用。

    附:没有必要将smallest 保持排序。对算法稍作修改,smallest 可以保持未排序状态。这里的家庭作业是调整这个算法,使smallest不要求保持排序。

    【讨论】:

      猜你喜欢
      • 2014-12-07
      • 1970-01-01
      • 2021-01-13
      • 1970-01-01
      • 1970-01-01
      • 2013-04-28
      • 2021-12-24
      • 1970-01-01
      • 2019-08-13
      相关资源
      最近更新 更多