今天对于一个关于如何查找1-N-1共N个数据的数组中重复的数据进行了深入的了解和探讨
以下是程序代码:
一、冒泡排列
#include <stdio.h>
#define SIZE 10
void swap(int a[],int n)
{
int i, j, temp;
for (j = 0; j < n - 1; j++)
{
for (i = 0; i < n - 1 - j; i++)
{
if(a[i] > a[i + 1])
{
temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
}
}
}
}
int main()
{
int i;
int number[SIZE]={};
printf("请输入要排序的10个数:\n");
for(i=0;i<10;i++)
{
scanf("%d",&number[i]);
}
swap(number,SIZE);
for(i=0;i<10;i++)
{
printf("%d\n",number[i]);
if(number[i] == number[i + 1])
{
printf("重复值=%d\n",number[i+1]);
}
}
return 0;
}
此程序功能是给数组输入10个数,然后将数组的数据重新组合和成从小到大的顺序排列并且将其中有重复的值打印出来。冒泡法就是将每一个数据与后面的数据比较,比后面大就替换从而进行排列。缺点:处理数据量大的数组时时间较长。
二、2个数组来寻找相同的数(用空间代替时间)
#include <stdio.h>
int main()
{
int i,c;
int a[]={1,3,2,6,5,4,9,2,7,9};
int b[10]={0};
for(i=0;i<10;i++)
{
b[a[i]]++;
while(b[a[i]]==2)
{
printf("%d\n",a[i]);
break;
}
}
return 0;
}
这个程序是运用2个数组来实现的,第一个数组存入数据,第二个数组全为0,根据第一个数组的数据将此数据对应的第二个数组的位置加1,判断第二个数组中哪一个数据不为1,打印出不为1数据对应的位置就是重复的数。缺点:处理数据量大的数组时内存运用比平常的大。
三、运用替换的方法
#include <stdio.h>
int main()
{
int a[10]={2,3,4,1,6,7,8,9,5,9};
int c,temp=10;
while(a[temp-1] != temp)
{
c=a[temp-1];
a[temp-1]=temp;
temp=c;
}
printf("%d\n",temp);
return 0;
}
同理,用一个数temp(数组总共位数)与数组中的数进行比较,不同就替换,然后在以temp的数为数组的位数再次比较,因为只有一个数是重复的并且是范围1—N-1,那么temp中的数将会与数组的1—N-1位都进行一次比较也就是将数组按1—N排列了,通俗的说就是数组的值通过temp与a[temp-1]对换,你会发现temp对应的值就是数组对应的位置。一旦排列的时候遇到了相同的值在将这个值去找到数组对应的位置时会发现先前那个位置以及排好了,这样就能找到重复的值了。缺点:数组的最后一位数据不能是数组的长度,不然输出的值就错误了。