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 }