微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果将输入数组定义为 const,如何对它进行排序?

如何解决如果将输入数组定义为 const,如何对它进行排序?

我正在尝试以升序方式对输入数组 pAddrSourceArray 进行排序,但输入数组被定义为 const,如下面的标题所示,因为它被强加,所以无法更改。

到目前为止,我已经知道如何对数组进行排序,但是我正在努力克服输入数组被定义为常量的事实。我不能(或我不知道)如何使用输入数组的内容创建一个辅助数组,以便我可以对这个辅助数组进行排序,然后分配给输出数组 pAddrResultArray

有关如何解决此问题的任何提示

void sortArray(uint32_t samplesCount,const int16_t *pAddrSourceArray,int16_t *pAddrResultArray)
{
    int16_t *pInputArray = pAddrSourceArray; // This is wrong,I kNow it should be const  int16_t *pInputArray = pAddrSourceArray;

    int16_t min_idx;

    // One by one move boundary of unsorted subarray
    for (uint32_t indxUnsort = 0; indxUnsort < samplesCount - 1; indxUnsort++ )
    {

        // Find the minimum element in unsorted array
        min_idx = indxUnsort;
        for (uint32_t k = indxUnsort + 1; k < samplesCount; k++)
        {
            if (pInputArray[k] < pInputArray[min_idx])
            {
                min_idx = k;
            }
        }

        // Store actual local min value
        int16_t localMin = pInputArray[min_idx];
        // Update new min at current indxUsort position
        pInputArray[min_idx] = pInputArray[indxUnsort];
        // Append the new local min found
        pInputArray[indxUnsort] = localMin;
    }

    // Assign sorted array to output array
    pAddrResultArray = pInputArray;
}

解决方法

您不应该就地对源数组进行排序,但您可以简单地将其复制到目标数组并使用您选择的方法对其进行排序:

  // Forward Netlify Function requests to `netlify-lambda` server
  // when the development server is running.
  developMiddleware: app => {
    app.use(
      "/.netlify/functions/",proxy({
        target: "http://localhost:9000",// <--- Port that `netlify-lambda` is using
        pathRewrite: {
          "/.netlify/functions/": "",},})
    )
  },
,

这是一种方法。它依次从输入数组中获取每个输入值,并在输出数组的第一个元素大于输入数组(如果有)的位置将其插入到输出数组中,否则在输出数组的末尾,打乱输出数组的剩余元素加一。这可确保到目前为止填充的输出数组始终按升序排列。

由于到目前为止的输出数组内容已经按升序排序,因此可以使用二分查找来确定插入输入值的位置。

O(N^2) 的整体平均时间复杂度主要取决于将元素插入到输出数组中,尽管到目前为止查找插入位置的二分查找有点帮助,与 O(log n) 相比O(n) 用于线性搜索。

6e2d99a75e7f637e9c07e9c78acb04f4  temp.dat
6e2d99a75e7f637e9c07e9c78acb04f4  main.cpp
,

如果您知道它应该是 const,则将其声明为:

const int16_t *pInputArray

但是当您使用 const int16_t * 初始化非常量指针时,您至少应该收到来自编译器的警告(类似于 initializer discards 'const' qualifier)。

如在

void f(const int *a)
{
        int *b = a;
}

编译给出:

pru58405.c:4:7: warning: initializing 'int *' with an expression of type 'const int *' discards qualifiers
      [-Wincompatible-pointer-types-discards-qualifiers]
        int *b = a;
             ^   ~
1 warning generated.

您在程序中管理的对象的const性质在很大程度上取决于您用于变量的类型。一旦您声明它为非const,您就可以毫无问题地访问和修改它(除非它位于真正的只读段中,在这种情况下,如果您尝试修改值,您可能会遇到异常)

由于您发布了一个不完整、无法验证的示例(阅读标题为 How to create a Minimal,Reproducible Example 的页面),因此我们无法为您提供更多帮助。对此我深表歉意。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。