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 }

浙公网安备 33010602011771号