- 论坛徽章:
- 0
|
6可用积分
抱歉只有6分,请见谅
就是算法导论中关于线性时间内查找元素的算法
代码如下,昨天一直盖到现在,是在不会了 ,拜托了- #include<iostream>
- #include<ctime>
- #include<iterator>
- using namespace std;
- int random(int p,int q)
- {
- time_t t;
- srand((unsigned)time(&t));
- return rand()%(q-p)+p;
- }
- int mid(int L,int R)
- {
- return L+(R-L)/2;
- }
- void swap(int &a,int&b)
- {
- int temp=a;
- a=b;
- b=temp;
- }
- void randomshuffle(int A[],int L,int R)
- {
- for(int i=L;i<R;i++)
- {
- int j=random(i,R);
- swap(A[i],A[j]);
- }
- }
- void insertsort(int A[],int L,int R)
- {
- for(int i=L+1;i<=R;i++)
- {
- int value=A[i];
- int j=i-1;
- while(j>=L&&A[j]>value)
- {
- A[j+1]=A[j];
- j--;
- }
- A[j+1]=value;
- }
- }
- int partition(int A[],int L,int R,int val)
- {
- int i;
- for(i=L;i<=R;i++)
- {
- if(A[i]==val)
- {
- break;
- }
- }
- swap(A[i],A[R]);
- int j=L-1;
- for(i=L;i<R;i++)
- {
- if(A[i]<val)
- {
- j++;
- swap(A[j],A[i]);
- }
- }
- swap(A[j+1],A[R]);
- return j+1;
- }
- int selete(int A[],int L,int R,int i)
- {
- if(R-L<5)
- {
- insertsort(A,L,R);
- //cout<<A[L+i-1]<<"***";
- return A[L+i];
- }
- int size=(R-L+6)/5,left,right;
- for(int k=0;k<size;k++)
- {
- left=L+k*5;
- right=(L+k*5+4>R?R:L+k*5+4);
- insertsort(A,left,right);
- swap(A[L+k],A[mid(left,right)]);
- }
- int x=selete(A,L,L+size-1,(size-1)/2);
- int M=partition(A,L,R,x);
- int K=M-L+1;
- if(K==i)return A[K];
- else if(K>i)
- {
- return selete(A,L,K-1,i);
- }
- else
- {
- return selete(A,K+1,R,i-K);
- }
- }
- int main()
- {
- int A[100];
- int i;
- for(i=0;i<100;++i) A[i] = i+1;
- randomshuffle(A,0,99);//随机排列,打乱顺序
- cout<<"Init A:\n";
- copy(A,A+99,ostream_iterator<int>(cout," "));
- cout<<endl;
- for(int i=0;i<100;++i)
- {
- cout<<i<<" th element: ";
- cout<<selete(A,0,99,i)<<endl;
- }
- cout<<endl;
- }
复制代码 |
|