【问题标题】:Inserting a random number into an array with sorted order C++将随机数插入具有排序顺序 C++ 的数组中
【发布时间】:2012-08-21 09:58:56
【问题描述】:

您好,我正在尝试创建一个插入随机数的数组,但是当它插入时,该数组保持不变。例如,如果数组包含 10 20 30 并且随机数是 11,则函数会将其放在 10 之后,并将 20 和 30 移到列表的下方。以下是该功能的要求。

  • insertNumber 将给定的随机数插入数组并保持顺序。
  • 数据数组包含按从索引 0 到大小 - 2 的排序顺序排列的整数。
  • randomNum 是要插入的整数
  • data 是包含排序整数的数组
  • size 是数组可以容纳的元素总数

到目前为止,这是我的代码。我的输出什么也没得到。

#include"utils.h" 

void insertNumber(int randomNum, int data[], int size)
{
    for(int i = 0; i < 10; i++)
    {
        randomNum = data[i];
        if (randomNum > data[i] && i < size - 2)
        {
            for ( int j = 0; j < 10; j--)
            {
                data[i+1] = data [i];
                i--;
            } 
        }
        data[i] = randomNum;
    }
}

void display(int data[],  int size)
{
    for (int i = 0; size < 10; i++)
    {
        cout << " " << data[i];
    }

}

【问题讨论】:

  • 你需要一个数组,还是你也可以使用一个有序的容器?
  • 第 5 行完全错误。 if 条件永远不会满足,因此您的数组将始终保持不变。
  • 可能是拼写错误但“size

标签: c++ arrays random variable-assignment sortedlist


【解决方案1】:

您可以使用std::lower_bound 算法拥有插入位置,并使用std::vector 容器通过insert 方法移动元素

【讨论】:

    【解决方案2】:

    这不是更好的实现方式吗?

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <ctime>
    #include <cstdlib>
    
    int main() {
        std::vector<int> randomInts;
        srand(time(0));
        for(int i = 0; i < 10; i++)
            randomInts.push_back((rand()%30)+1); //Inserts random numbers 1-30.
    
        std::sort(randomInts.begin(),randomInts.end());
        for(auto i : randomInts)
            std::cout << i << " ";
    }
    

    输出:3 6 9 13 14 16 19 20 25 30

    【讨论】:

    • 可能是这样,但我的大学教授只想要该函数中的一个数组,并且不希望我们更改他在 main 中所做的任何事情。
    • @KaylaBianchi 他是想让你实现冒泡排序吗?
    • 不只是在插入一个数字后排序,以便在数组中按数字顺序排列。
    • @KaylaBianchi 那叫selection sort
    • 哦,我明白了。我会调查的。
    【解决方案3】:

    您可以使用 BinarySearch 来搜索您的数组并查看随机数是否存在。如果它确实存在,那么您可以在现有的附近插入。

    void binary_search(int A[], int key, int imin, int imax)
    {
      if (imax < imin):
        // Insert key as the next element after imax
      else
        {
          // calculate midpoint to cut set in half
          int imid = midpoint(imin, imax);
    
          // three-way comparison
          if (A[imid] > key)
            // key is in lower subset
            binary_search(A, key, imin, imid-1);
          else if (A[imid] < key)
            // key is in upper subset
            binary_search(A, key, imid+1, imax);
          else
            // key has been found so insert it after imax
        }
    }
    

    【讨论】:

    • 很高兴知道。我不认为我可以在我的作业中使用它,因为我们只允许使用我给出的两个函数,所以它大部分是在 insertNumber 函数中。
    • @KaylaBianchi 带或不带 main 的两个函数?如果没有你可以使用 binary_search() 和 void insert(int A[], int length, int key, int position)
    【解决方案4】:

    在你的函数中找到大于它的元素后插入你的随机数

    for( i =0; i<size ;i++)
    {
        if(data[i] > randomNumber)
        {
             valueToPush = data[i];
             data[i] = randomNumber;
             randomNumber = valueToPush;
        }
    }
    data[size] = randomNumber
    

    【讨论】:

    • 这是正确的,但不是最理想的。该算法在 O(n) 时间内运行,而如果您使用二进制搜索,它可以在 O(log n) 时间内运行,这是可能的,因为数组已排序。
    猜你喜欢
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 2017-12-24
    相关资源
    最近更新 更多