删除C中数组中的重复数字:

时间:2015-11-21 16:41:10

标签: c arrays algorithm duplicates complexity-theory

#include <stdio.h>

int main()
{
    int array[20], t = 0; //20-t is the new size of array.

    for(int i = 0; i<20; i++)
        scanf("%d", &array[i]);

    for(int i = 0; i<20-t; i++)
    {
        for(int j = i+1; j<20-t; j++)
        {
            if(array[i] == array[j])
            {
                for(int z = j; z<20-t; z++)
                    array[z] = array[z+1];//shift numbers.
                    t++; 
                    i = -1;
            }
        }
    }
}

这个程序工作正常,但我不知道为什么当i = -1但是当i = 0时它呢?我也想知道这段代码的复杂性。

for(int i = 0; i<20-t; i++)
    printf("%d ", array[i]); //Array after duplicates have been removed.
    return 0;
}

2 个答案:

答案 0 :(得分:4)

如果您按以下方式编写程序

#include <stdio.h>

#define N   20

int main( void )
{
    int a[N];
    int n;
    int i;

    for ( i = 0; i < N; i++ ) scanf( "%d", &a[i] );

    n = 0;
    for ( i = 0; i < N; i++ )
    {
        int j = 0;
        while ( j < n && a[i] != a[j] ) ++j;
        if ( j == n ) a[n++] = a[i];
    }

    for ( i = 0; i < n; i++ ) printf( "%d ", a[i] );
    printf( "\n" );

    return 0;
}

然后算法的复杂性将是O(N ^ 2)。

至于你的算法,那么它的复杂度是O(N ^ 3)。

那就是你的方法效率低下。

答案 1 :(得分:1)

首先是[z,20-t + 1]中的内部循环访问元素,它是数组之外的1个元素。 &#39;班次号码&#39;循环应该是:

for(int z = j; z<20-t-1; z++)
    array[z] = array[z+1];//shift numbers.

要回复您的问题,它可以与i = -1一起使用,因为i将通过for-j循环递增。因此,它将是下一次迭代的0(而不是1,从而跳过1个元素)。

说,你需要做的是减少j迭代器,即:

t++; --j;

它会跑得更快!