2007winter

做自己真心想做的事,你就没事了

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

 

  1 #include <iostream>
  2 #include <iomanip>
  3 using namespace std;
  4 
  5  
  6 void swap(int &x, int &y)
  7 {
  8     int tmp = x;
  9     x = y;
 10     y = tmp;
 11 }
 12  
 13  void insert_sort(int A[], int p, int r)
 14  {
 15      int i,j;
 16      int key = 0;
 17      for (i=p+1; i<=r; ++i)
 18      {         
 19          if(A[i]<A[i-1])
 20          {
 21              key = A[i];
 22              for(j=i-1;j>=p && A[j]>key;--j)
 23              {
 24                  A[j+1] = A[j];
 25              }
 26              A[j+1] = key;
 27          }        
 28      }
 29  }
 30  
 31  
 32  int partion(int A[],int p, int r)
 33  {
 34      int count = p - 1;
 35      int key = A[r]; 
 36      for (int i=p; i<=r-1; i++)
 37      {
 38          if (A[i] < key)
 39          {
 40              count++;
 41              swap(A[count],A[i]);
 42          }
 43      }
 44      swap(A[count+1],A[r]);
 45      return count+1;
 46  }
 47  
 48  int get_median(int data[], int p, int r)
 49  {
 50      int i=0, j=0;
 51      int n = r - p + 1;           
 52      int remains = n%5;
 53      int int_count = n - remains;
 54      int int_group = int_count/5; 
 55      int group_count = (n+4)/5;   
 56      
 57      int *group_median = new int[group_count];
 58      
 59      if (p==r)
 60      {
 61          return data[p];
 62      }
 63      memset(group_median,0,group_count);      //对动态申请的内存清零
 64      
 65      //以下代码求出五个元素为一组的中位数
 66      if (0 == remains) //如果元素的个数正好可以分为以5个元素为单位的整数组
 67      {
 68          for (i=p; i<=r-4; i=i+5)
 69          {
 70              insert_sort(data, i, i+4);
 71              group_median[(i-p)/5] = data[i+2];
 72          }
 73      }
 74      else
 75      {
 76          for (i=p; i<=(r-remains-4);i=i+5)
 77          {
 78              insert_sort(data, i, i+4);
 79              group_median[(i-p)/5] = data[i+2];
 80          }
 81          //处理不够5个元素的组,改组开始的序号为r-remains+1,结束序号为r
 82          insert_sort(data,r-remains+1,r);
 83          group_median[group_count-1] = data[r-remains+1+remains/2];
 84      }
 85  
 86 
 87      if (group_count==1)
 88      {
 89          return group_median[0];
 90      }
 91      else
 92      {
 93          return get_median(group_median,0,group_count-1);
 94      }
 95  
 96      delete [] group_median;
 97      return 0;
 98  }
 99  
100 
101  int get_position(int A[], int p, int r, int key)
102  {
103      for (int i=p; i<=r; i++)
104      {
105          if (A[i]==key)
106          {
107              return i;
108          }
109      } 
110      return -1;
111  }
112  
113  //该函数是为了找到数组A中,第seq小的数
114  int select(int A[],int p, int r, int seq)
115  {
116      //获得数组A的中位数的中位数,将其作为划分数组的支点
117      int pivot_key = get_median(A, p, r);
118      int pos = get_position(A,p,r,pivot_key);
119      swap(A[pos],A[r]);
120 
121      int i = partion(A, p, r); 
122 
123 
124 
125 
126 
127      int x = i - p + 1;
128      if (seq == x)
129      {
130          return A[i];
131      }
132      else if (seq < x)
133      {
134          select(A, p, i-1, seq);
135      }
136      else
137      {
138          select(A, i+1, r, seq-x);
139      }
140  
141  }
142  
143  
144  int main()
145  {
146      int arrays[] = {23,13,12,14,11,8,9,20,7,4,5,6,2,1,3};
147      int size = sizeof(arrays) / sizeof(int);
148  
149      for (int i=1; i<=size; i++)
150      {
151              cout << "select "<<i<<"->"<< select(arrays,0,size-1,i) << endl; 
152      }
153 
154      char wait;
155      cin>>wait;
156 
157  
158      return 0;
159  }
posted on 2012-10-28 22:34  2007winter  阅读(132)  评论(0)    收藏  举报