1.第三版的算法导论上面的翻译感觉略有问题,“k分位数是指 能把有序集合分成k个等大小集合的第k-1个顺序统计量”。 觉得应该改为, “k分位数是指 能把有序集合分成k个等大小集合的k-1个顺序统计量”。
2.寻找k分位数,利用二分思想,寻找k分位数,首先找其中的第k/2分位点,一次递归寻找需要的点。、
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <ctime>
#include <algorithm>
using namespace std;
int* createarray(int);
void myswap(int*A,int p,int q);
void print(int*,int,int);
int random_select(int*,int,int,int);
int random_partition(int*A,int,int);
int mypartition(int*,int,int);
int *kth_qua(int *A,int p,int r,int k,int *,int t);
int main ()
{
int *A = createarray(16);
// srand(time(NULL));
print(A,0,16);
int k = 4;
int *B = new int[4];
kth_qua(A,0,15,4,B,4);
print(B,0,4);
sort(A,A+16);
print(A,0,16);
}
int* createarray(int n)
{
int *aret = new int[n];
srand(time(NULL));
for (int i = 0;i < n;i ++)
{
*(aret+i) = rand()%1024;
}
return aret;
}
void myswap(int *A,int p,int q)
{
int temp = A[p];
A[p] = A[q];
A[q] = temp;
return;
}
void print(int *A,int p,int q)
{
for (int i = p;i < q;i ++)
{
cout << A[i] << '\t' ;
}
cout << "\n----------------endl\n";
}
int mypartition(int*A,int p,int r)
{
int i = p -1;
int j = p;
int key = A[r];
for (j = p;j <=r-1; j ++)
{
if (A[j] < key)
{
i ++;
myswap(A,i,j);
}
}
i ++;
myswap(A,i,r);
return i;
}
int random_partition(int *A,int p,int r)
{
int i = rand()%(r-p+1) + p;
// cout << "e " << p << ' ' << r << ' '<< endl;
myswap(A,i,r);
return mypartition(A,p,r);
}
int random_select(int *A,int p,int r,int k)
{
int q = random_partition(A,p,r);
cout << "rr " << p <<' '<< r <<' '<< k << endl;
int i = p,j = 0;
int t = q-i+1;
while (t != k)
{
// cout << "dsa " << k << ' ' << t <<' '<< q << ' ' <<i << ' ' << j <<endl;
if (t < k)
{
i = q +1;
k = k-t;
}
else
{
j = q-1;
}
q = random_partition(A,i,j);
t =q-i+1;
}
return q;
}
int *kth_qua(int *A,int p,int r,int k,int *B,int t)
{
if ((r-p+1) <= t)
{
return 0;
}
int sub_k = (r-p+1)/t;
int mid_k = sub_k/2;
int dmin_k = mid_k*t;
int s = random_select(A,p,r,dmin_k);
// cout <<"s " << s << endl;
// print(A,0,16);
//cout << "dsad " << p << ' ' << r <<' ' <<s <<endl;
B[s/t] = A[s];
kth_qua(A,p,s,k,B,t);
kth_qua(A,s+1,r,k,B,t);
}