求 算法
一个数组a[10] {1,2,3,4,4,5,6,7,8,9}怎么找出那个相同的数字?
三种方法
程序代码:
/*************************************************
以上略
*************************************************/
for(i=0;i<10;++i)
for(j=0;j<10;++j)
if(a[i]==a[j])
{
b[k]=a[i];
++k;
n++;
}
………
/**************************************************
以下略
**************************************************/

程序代码:
//***********数组无序的情况**********
int ElementUniqueness(int* arr,int size_)
{ //时间复杂度 O(n^2)
for(int i=0;i<size_;++i)
for(int j=i+1;j<size_;++j)
if(arr[i]==arr[j]) return arr[i];
return -10000;
}
int ElementUniqueness(int* arr,int size_)
{ //时间复杂度 O(n^2)
for(int *i=arr;i<arr+size_;++i)
for(int *j=i+1;j<arr+size_;++j)
if(*i == *j) return *i;
return -10000;
}
int ElementUniqueness(int* arr,int size_)
{ //时间复杂度 O(n^2)
if(size_>1)
{
ElementUniqueness(arr,size_-1);
int key = arr[size_-1];
for(int i=0;i<size_-1;++i)
if(key==arr[i]) return arr[i];
return -10000;
}
}
//上面是一般的O(n^2)算法,下面用预排序来实现O(n^2)
//排序为O(n^2)的可用:选择,插入,冒泡等,这里用插入
void InsertSort(int* arr,int size_)
{
for(int i=1;i<size_;++i)
{
int key=arr[i];
int j=i-1;
for(;j>=0&&key<arr[j];--j)
arr[j+1]=arr[j];
arr[j+1]=key;
}
}
int ElementUniqueness(int* arr,int size_)
{
InsertSort(arr,size_);
for(int i=0;i<size_-1;++i)
if(arr[i]==arr[i+1]) return arr[i];
return -10000;
}
//时间复杂度在O(n)的
int ElementUniqueness(int *arr,int size_,int max_n)
{
int *count=new int[max_n+1];
for(int i=0;i<=max_n;++i) count[i]=0;
for(int j=0;j<size_;++j) count[arr[j]] +=1;
for(int k=0;k<size_;++k)
if(count[arr[k]]>1) { delete [] count; return arr[k];}
delete [] count;
return -10000;
}
//下面时间复杂度为O(n)的可选用计数排序来做预排序
void countSort(int* arr,int size_,int max_n)
{
int *count=new int[max_n+1];
int *temp =new int[size_];
for(int i=0;i<=max_n;++i) count[i]=0;
for(int j=0;j<size_;++j) temp[j]=arr[j];
for(int m=0;m<size_;++m) count[arr[m]] +=1;
for(int n=1;n<size_;++n) count[n] +=count[n-1];
for(int k=0;k<size_;++k)
{
arr[count[temp[k]]-1] = temp[k];
count[temp[k]] -=1;
}
delete [] count; delete [] temp;
}
int ElementUniqueness(int* arr,int size_,int max_n)
{
countSort(arr,size_,max_n);
for(int i=0;i<size_-1;++i)
if(arr[i]==arr[i+1]) return arr[i];
return -10000;
}
//时间复杂度为O(nlgn)的可选合并,快速,堆等排序做预排序,下面用快速给出
void swap(int* arr,int i,int j)
{
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
int partition(int* arr,int l,int r)
{
int key = arr[l];
int i=l,j=r;
for(++i;i<j;)
{
for(;arr[i]<key;++i);
for(;arr[j]>key;--j);
swap(arr,i,j);
}
swap(arr,i,j);
swap(arr,l,j);
return j;
}
void Qsort(int* arr,int l,int r)
{
if(l<r)
{
int j=partition(arr,l,r);
Qsort(arr,l,j-1);
Qsort(arr,j+1,r);
}
}
int ElementUniqueness(int* arr,int size_)
{
Qsort(arr,0,size_-1);
for(int i=0;i<size_-1;++i)
if(arr[i]==arr[i+1]) return arr[i];
return -10000;
}
