立即将值放在已排序的位置

时间:2010-09-18 22:29:13

标签: c++ sorting

我有一个关于c ++实验室作业的问题。任务是实现一些函数来添加值,从数组中删除值等等。我现在已经完成了大部分工作,但是我对插入功能有一些问题。赋值需要我将float值插入此数组,而不使用任何算法在每次插入后对其进行排序。我也许不会使用STL的任何东西。它将假设我立即在排序位置插入每个值

所以我想知道是否有人能给我任何线索如何解决这个问题?

修改 这项任务我不会用链表实现它。这将是我下一次的分配。

我曾尝试根据您的伪代码编写插入函数。虽然我没有正确理解。无论如何,这是代码。

void array_insert(data_t list[], int& space_used, data_t value)
{

   if(space_used == 0)
   {
      list[space_used] = value;    
   }
   else
   {

      for(int i = space_used+1; i >= 0; i--)
      {
         if(value > list[i])
         {
            list[i+1] = value;
            break;
         }
         else
         {
            list[i+1] = list[i];
         }
         if(i == 0)
         {
            list[i] = value;
         }
      }
   }
   space_used++;
}

终于完成了,这是完整的代码。感谢Mark和Casablanca的帮助

3 个答案:

答案 0 :(得分:4)

您必须移动所有元素以为新元素腾出空间。这是O(n)操作。由于你不能做得比O(n)更好,我认为使用这个简单的O(n)算法是合理的:

  • 将i设置为数组中最后一个元素的索引
  • 如果要插入的元素较大,则a [i]然后在索引i + 1处插入元素并停止。
  • 否则设置[i + 1] = a [i]然后减小i并重复上一步。
  • 如果我达到0,则在开头插入元素。

这假设您的数组有空间来插入额外的元素。

答案 1 :(得分:2)

您可以使用binary search找到插入位置。

答案 2 :(得分:2)

考虑插入时需要完成的单独任务:

  1. 找到新元素应该在哪里的索引n
  2. 将每个元素从最后一个移动到n(包括)数组中的一个插槽(仅当数组中有未使用的单元格时,否则放弃并报告错误)
  3. 将新元素放入array[n]
  4. 前两个步骤很容易就是他们自己的功能,可以帮助你在心理上分离任务:

    1. n = index_to_put(float new_element, float *array, int array_max, int last_used);
    2. new_last_used = move_cells_up(float *array, n, int array_max, int last_used);
    3. array[n] = new_element; last_used = new_last_used;