【问题标题】:Kth smallest element of an Array using Quick Sort algorithm使用快速排序算法的数组的第 K 个最小元素
【发布时间】:2021-09-05 17:45:57
【问题描述】:

我正在努力解决这个挑战:

使用快速排序算法返回数组的第 Kth 个最小元素

我没有得到以下输入的正确输出:

int arr[] = {3, 2, 1};
int k = 2;

我不明白我的错误在哪里。

我的 C++ 代码:

#include<bits/stdc++.h>

int partion(int arr[], int l, int r)
{
    int x = arr[r];
    int i = l - 1;
    int j;
    for (j = l; j < r; j++)
    {
        if (arr[j] < x)
        {
            i++;
            swap(arr[i], arr[j]);
        }
    }
    swap(arr[r], arr[i + 1]);
    return i + 1;
}

int quick(int arr[], int l, int r, int k)
{
    if (k > 0 && k <= r - l + 1)
    {
        int m = partion(arr, l, r);
        return m == k - 1 ? arr[m] : k - 1 < m ? quick(arr, l, m - 1, k)
                                               : quick(arr, m + 1, r, k - m + l - 1);
    }
    return INT_MAX;
}

所以当我运行这段代码时:

int arr[] = {3, 2, 1};
int k = 2;
std::cout << quick(arr, 0, sizeof(arr) / sizeof(int), k);

我得到的输出是 INT_MAX,而预期是 2。

【问题讨论】:

  • 您预计会发生什么,会发生什么?
  • 试过调试了吗?你的发现是什么?
  • 我尝试调试,但我得到了一些巨大的数字而不是正确的输出
  • 我希望得到第 k 个最小的元素,但我得到了一些巨大的数字,因为它在所有情况下都返回 INT_MAX

标签: c++ arrays algorithm data-structures quicksort


【解决方案1】:

您的 quick 函数缺少(正)基本情况:当范围仅涵盖一个元素(并且 k 为 1)时,该函数应返回该元素而无需进一步递归。

所以在 if 块内添加基本情况:

    if (k > 0 && k <= r - l + 1)
    {
        if (l == r) return arr[l];   // <--- base case
        // ...rest of your code
    }

【讨论】:

    猜你喜欢
    • 2021-01-06
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    相关资源
    最近更新 更多