关于去除数组中重复元素
------------恢复内容开始------------
有一串数组,里面包括了一些整数,使用C语言编写一个函数来保证其中每一个元素只有一个而且每个元素之间不留有空位。
首先,设计一个算法,我看到这个程序首先想到的是这样的算法。例如,有这么一个数组{7,5,8,9,5,4,9,5},从第一个数7开始第一个循环,与5比较不重复,5保留,一直到第八个数5,始终没有与7相同的数,因此第一个数7位置确定,然后在处理第二个数5,把5逐个与后面的每一个数进行比较,直到第五个数5,发现重复,将这个五5剔除,并把5后面的数的下标减一。如是一直执行到最后一个数,完成目标。这种办法是能够实现目的的,但是效率太过于低下了。无论这组数组中是否有重复的元素,需要比较的次数始终是
代码如下:
#include<stdio.h>
#include<windows.h>
int main(void){
int a[]={7,5,8,9,5,4,9,5};
int i=0;
int j=1;
int k;
int n=sizeof(a)/sizeof(a[0]);
printf("%d\n",n);
for(i=0;i<=n-1;i++){
for(j=i+1;j<=n-1;j++){
if(a[i]==a[j]){
n=n-1;
for(k=j+1;k<=n+1;k++){
a[k-1]=a[k];
}
}
}
}
for(i=0;i<=n-1;i++){
printf(" %d",a[i]);
}
printf("\n%d",n);
system("pause");
return 0;
}
我们想一个更加优化的算法,还是那一串数组{7,5,8,9,5,4,9,5},先取出第一个数7,由于是取出来的第一个数,直接放回原位(不会有数和它重复!)再取出第二个数5与前面的所有数比较,也没有重复的,所以放到第二个,一直到去除第五个数5发现与第二个5重复把他给扔掉,再取出第六个数4发现没有重复,所以把他前移一格。如是重复到最后一个数即可完成需求。与上一个算法把数组中的元素取出来与已经处理好的数据比较不同,这个算法是把未处理的元素与已经处理好的元素比较,效率更加高。
代码如下:
#include<stdio.h>
#include<windows.h>
int main(void){
int a[]={7,5,8,9,5,4,9,5};
int i=0;
int j=-1;
int k=0;
int flag=0;
int n=sizeof(a)/sizeof(a[0]);
for(k=0;k<n;k++){
printf(" %d",a[k]);
}
for(i=0;i<n;i++){
a[i];
flag=0;
for(k=0;k<=j;k++){
if(a[k]==a[i]){
flag=1;
break;
}
}
if(flag==0){
j++;
a[j]=a[i];
}
}
printf("\n");
for(k=0;k<=j;k++){
printf(" %d",a[k]);
}
system("pause");
return 0;
}
------------恢复内容结束------------

浙公网安备 33010602011771号