算法导论第九章

来源:互联网 发布:ta热分析软件下载 编辑:程序博客网 时间:2024/06/15 04:20
#include<iostream>         //算法导论第九章#include<bitset>#include<ctime>using namespace std;template <size_t UpperBound> class Urand{      //生成随机数  bitset<UpperBound> used;  public:      Urand(){ srand(time(0)); }      double operator() ();  };  template<size_t UpperBound>  inline double Urand<UpperBound>::operator()()  {      if(used.count() == UpperBound)          used.reset();      size_t newval;      while(used[newval = rand() % UpperBound])         ;      used[newval] = true;      return newval*0.1;  }  int partition( double darr[], int p, int q)   //划分  {         int groupnum = (q-p+1)/5;int lastgroupnum = (q-p+1)-groupnum*5;    int num = (lastgroupnum==0) ? groupnum : groupnum+1;    double *Mid = new double[num];   //中位数int *Marr = new int[num];        //中位数标志位    int i = 0;   //循环标志位int j = 0;int h = 0;int k = 0;int w = 0;int y = 0;int z = 0;    for( i=0; i<groupnum; i++){for( j=i*5+1+p; j<i*5+5+p; j++){   double indexOne = darr[j];if( darr[j-1]> indexOne ){for( h = j-1; darr[h]>indexOne&&h>=i*5; h--){darr[h+1]=darr[h];}darr[h+1]=indexOne;}}Mid[i] = darr[(i*5+p+i*5+4+p)/2];Marr[i] = (i*5+p+i*5+4+p)/2;   //记住标志}    if( lastgroupnum != 0){   for( k=groupnum*5+1+p; k<groupnum*5+lastgroupnum+p; k++)   {   double indexTwo = darr[k];if( darr[k-1]>indexTwo ){for( w=k-1; darr[w]>indexTwo&&w>=groupnum*5; w--){                  darr[w+1]=darr[w];}darr[w+1]=indexTwo;}   }   Mid[groupnum] = darr[(groupnum*5+p+groupnum*5+lastgroupnum+p)/2];       Marr[groupnum] = (groupnum*5+p+groupnum*5+lastgroupnum+p)/2;   //记住标志位    }groupnum = ( lastgroupnum==0 ) ? groupnum : groupnum+1;for( y=1; y<groupnum; y++)    //中位数排序{   double indexThree = Mid[y];int temp = Marr[y];if( Mid[y-1]>indexThree ){  for( z=y-1; Mid[z]>indexThree&&z>=0; z-- )  {                 Mid[z+1]=Mid[z]; Marr[z+1]=Marr[z];  }      Mid[z+1]=indexThree;  Marr[z+1]=temp; }}    double dtemp = darr[Marr[groupnum/2]];darr[Marr[groupnum/2]] = darr[p];darr[p] = dtemp;double x = darr[p];      int start = p;    for( int r=p+1; r<=q; r++)  {         if( darr[r]<=x )        {             start++;             swap(darr[start], darr[r]);         }  }      swap(darr[start], darr[p]);      return start;}  double SELECT( double dArr[], int p, int q, int i)   //select函数{      if( p==q )      {         return dArr[p];      }      int r = partition( dArr, p, q);      int k = r-p+1;      if( i==k )      {          return dArr[r];      }      else if( i<k )      {          return SELECT( dArr, p, r-1, i);      }      else      {         return SELECT( dArr, r+1, q, i-k);  }  }  int main(){   Urand<23> u;double darr[23] = { 0.0 };for( int i=0; i<23; i++){darr[i]=u();}    cout<<SELECT(darr, 0, 22, 11)<<endl;      return 0;}

原创粉丝点击