求 算法
一个数组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; }