删除多个数组元素和移位数组的算法

时间:2014-10-20 17:02:20

标签: c++ arrays algorithm sorting

如果5小于element[i]需要移动3代替element[i+1],我会使用element[i]项来说明数据}。

int array[5] = {4, 2, 3, 5, 1};
int number = 3;

    for (int i = 0; i < number; i++)
    {
        if (array[i] > number)
        {
           for (int j = 0; j < i - 1; j++)
           {
               array[j] = array[j + 1];
           }
           number = number - 1;
        }
    }

预期结果为array = {2, 3, 1, anyNumber, anyNumber};

6 个答案:

答案 0 :(得分:1)

上述问题的O(n)工作代码..但正如其他人在评论中指出的那样..你最终得到一个使用较少空间然后分配给它的数组..

#include<stdio.h>

int main()
{

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

        int* temp1 = arr;
        int* temp2 = arr;
        int i, n1 = 5, n2 = 5;

        for(i = 0; i < n1; i++)
        {
                if(*temp2 >= 3)
                {
                        *temp1 = *temp2;
                        temp1++;
                        temp2++;
                }
                else
                {
                        n2--; //the number of elements left in the array is denoted by n2
                        temp2++;
                }
        }
}

答案 1 :(得分:1)

嵌套循环为您提供O( n 2 )复杂性和非显而易见的代码。

更好地使用std::remove_if

int array[5] = {4, 2, 3, 5, 1};
int number = 3;
remove_if( begin( array ), end( array ), [=]( int x ) { return x>number; } );

免责声明:编码器未触及代码。

答案 2 :(得分:0)

试试这段代码。你不应该减少每一步的数量。此外,第二个循环应该从i开始并在数组的末尾停止:

int array[5] = {4, 2, 3, 5, 1};
int number = 3;

for (int i = 0; i < number; i++)
{
    if (array[i] > number)
    {
       for (int j = i; j < 5; j++)
       {
           array[j] = array[j + 1];
       }
    }
}

答案 3 :(得分:0)

这是一个更紧凑和惯用的方式(无论如何我都是这样看)从数组中删除项目的方法:

#include <iostream>
#include <algorithm>
#include <iterator>

int main()
{
   int array[] = {4, 2, 3, 5, 1};
   int* begin = array;
   int* end = begin + sizeof(array)/sizeof(array[0]);
   int number = 3;

   end = std::remove_if(begin, end, [&number](int v) {return v > number;});
   std::copy(begin, end, std::ostream_iterator<int>(std::cout, " "));
   std::cout << std::endl;

   return 0;
}

仅供比较,这是使用std::vector的版本:

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

int main()
{
   std::vector<int> array = {4, 2, 3, 5, 1};
   int number = 3;

   auto end = std::remove_if(array.begin(), array.end(), [&number](int v) {return v > number;});
   std::copy(array.begin(), end, std::ostream_iterator<int>(std::cout, " "));
   std::cout << std::endl;

   return 0;
}

答案 4 :(得分:0)

作为替代方案,如果你想保留你的物品,但是表示将来会发生什么,“删除”,可以使用的算法是stable_partition

#include <algorithm>
#include <iostream>
#include <iterator>
#include <functional>

int main()
{
    int vValues[] = {4,2,3,5,1};

    // partition the values on left and right.  The left side will have values
    // <= 3, and on right >3.  The return value is the partition point.
    int *p = std::stable_partition(vValues, vValues + 5, 
                                   std::bind2nd(std::less_equal<int>(), 3));
    // display information 
    std::cout << "Partition is located at vValues[" << std::distance(vValues, p) << "]\n";
    std::copy(vValues, vValues + 5, std::ostream_iterator<int>(std::cout, " "));
}

输出:

Partition is located at vValues[3]
2 3 1 4 5

您将看到2,3,1位于分区p的左侧,而4,5位于分区p的右侧。因此,“已删除”项目从p指向的位置开始。 std::partition确保元素在完成后仍处于相对顺序。

答案 5 :(得分:0)

我创建了自己的例子,希望这可以帮助人们作为参考:

html