算法导论 9.3-6 k分位数

来源:互联网 发布:js搅拌机型号 编辑:程序博客网 时间:2024/05/01 08:46

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);}


0 0