21xrx.com
2024-09-19 23:56:28 Thursday
登录
文章检索 我的文章 写文章
如何在C++中删除数组中的重复元素?
2023-07-13 16:45:02 深夜i     --     --
C++ 数组 删除 重复元素

在C++中,删除数组中的重复元素是一个非常常见的需求。这种需求通常出现在需要统计一个数组中元素个数的时候,或者在需要进行搜索和排序等算法的时候。以下是在C++中删除数组中的重复元素的一些方法。

首先,可以使用一个暴力的方法,遍历整个数组,将每个元素与其它元素进行比较,如果发现有重复的,就将其删除。这种方法的时间复杂度为O(n^2),当数组很大时,效率会非常低。

其次,可以使用STL中的set容器来删除重复元素。set是一个自动排序、不允许重复元素的容器,利用set的这个特性,只需要将数组中的元素插入到set中,然后再将set中的元素重新放回数组中,就可以去除重复元素。

示例代码如下:


#include <iostream>

#include <set>

using namespace std;

int main()

{

  int a[] = 3;

  set<int> s(a, a+12);

  int i = 0;

  for(set<int>::iterator it = s.begin(); it != s.end(); it++)

  {

    a[i++] = *it;

  }

  for(int j = 0; j < i; j++)

  {

    cout << a[j] << " ";

  }

  return 0;

}

运行结果为:1 2 3 4 5 6 7 8

最后,可以使用更高效的算法,例如“快速排序”,来去除重复元素。快速排序的思想是每次选取一个“基准”元素,将小于该元素的值放在左侧,大于该元素的值放在右侧,然后递归地处理左右两个子序列。这种方法的时间复杂度为O(nlogn),比第一种方法快很多。

示例代码如下:


#include <iostream>

using namespace std;

void quickSort(int a[], int left, int right)

{

  if(left < right)

  {

    int i = left, j = right, x = a[left];

    while(i < j)

    {

      while(i < j && a[j] >= x)

      

        j--;

      

      if(i < j)

      {

        a[i++] = a[j];

      }

      while(i < j && a[i] < x)

      {

        i++;

      }

      if(i < j)

      {

        a[j--] = a[i];

      }

    }

    a[i] = x;

    quickSort(a, left, i - 1);

    quickSort(a, i + 1, right);

  }

}

int main()

{

  int a[] = {1, 2, 3, 4, 5, 3, 2, 1, 6, 7, 8, 5};

  int n = sizeof(a) / sizeof(int);

  quickSort(a, 0, n - 1);

  int i = 0;

  for(int j = 1; j < n; j++)

  {

    if(a[j] != a[i])

    {

      a[++i] = a[j];

    }

  }

  for(int j = 0; j <= i; j++)

  {

    cout << a[j] << " ";

  }

  return 0;

}

运行结果为:1 2 3 4 5 6 7 8

总之,在C++中删除数组中的重复元素有多种方法,具体选择哪种取决于所需的时间复杂度和程序的实际情况。以上三种方法仅供参考,读者可以结合自己的实际情况进行选择。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复