A是一个长度为N的整形数组,其中可能包含重复的元素,例如A={1,2,2,3,2,1,3,2},删除数组中相同的元素后得到{1,2,3},
a) 如果数组没有排序,写一个C语言函数,输入参数为数组首地址和长度,删除其中重复的元素,返回删除后的数组的长度。
b) 上述函数的时间复杂度为多少,以删除前的数组长度N表示。
c) 如果数组A已经排好序,设计并写出一个C语言函数完成a)中的工作,要求时间复杂度是O(N) 。
#include<iostream>
using namespace std;
// a) 删除任意数组中相同的元素
int delete_same_all(int a[], int n)
{
int i, j, len=n;
for(i=0; i<len; ++i)
for(j=i+1; j<len; )
if(a[i] == a[j])
a[j]=a[--len];
else
++j;
return len;
}
// c)删除排序后的数组中相同的元素
int delete_sort_same_all(int a[], int n)
{
int i, k=1;
for(i=1; i<n; ++i)
{
if(a[i-1] != a[i])
{
if(i != k)
a[k] = a[i];
++k;
}
}
return k;
}
//打印数组
void show(int *arr, int n)
{
int i=0;
for(;i<n;i++)
cout<<arr[i]<<" ";
cout<<endl;
}
int main()
{
int A[] = {1,2,2,3,2,1,3,2};
int n, len;
n = sizeof(A)/sizeof(A[0]);
len = delete_same_all(A, n);
show(A, len);
int B[] = {1,2,2,2,3,3,3,10,12,77,77,77};
n = sizeof(B)/sizeof(B[0]);
len = delete_sort_same_all(B, n);
show(B, len);
return 0;
}