读书人

算法导论9.3线性时间查找算法

发布时间: 2012-03-31 13:13:26 作者: rapoo

【求助】算法导论9.3线性时间查找算法
最近在看算法导论;但是写出来的程序,提示出错 并且运行结果也是错的
请大牛指点


代码如下(只能开100分帖子见谅,如果嫌少,我再看贴补上几百分都可以)

C/C++ code
#include<iostream>#include<ctime>#include<iterator>using namespace std;int random(int p,int q){    time_t t;    srand((unsigned)time(&t));    return rand()%(q-p)+p;}int mid(int L,int R){    return L+(R-L)/2;}void swap(int &a,int&b){    int temp=a;    a=b;    b=temp;}void randomshuffle(int A[],int L,int R){    for(int i=L;i<R;i++)    {        int j=random(i,R);        swap(A[i],A[j]);    }}void insertsort(int A[],int L,int R){    for(int i=L+1;i<=R;i++)    {        int value=A[i];        int j=i-1;        while(j>=L&&A[j]>value)        {            A[j+1]=A[j];            j--;        }        A[j+1]=value;    }}int partition(int A[],int L,int R,int val){    int i;    for(i=L;i<=R;i++)    {        if(A[i]==val)        {            break;        }    }    swap(A[i],A[R]);    int j=L-1;    for(i=L;i<R;i++)    {        if(A[i]<val)        {            j++;            swap(A[j],A[i]);        }    }    swap(A[j+1],A[R]);    return j+1;}int selete(int A[],int L,int R,int i){    if(R-L<5)    {        insertsort(A,L,R);        //cout<<A[L+i-1]<<"***";        return A[L+i];    }    int size=(R-L+6)/5,left,right;    for(int k=0;k<size;k++)    {        left=L+k*5;        right=(L+k*5+4>R?R:L+k*5+4);        insertsort(A,left,right);        swap(A[L+k],A[mid(left,right)]);    }    int x=selete(A,L,L+size-1,(size-1)/2);    int M=partition(A,L,R,x);    int K=M-L+1;    if(K==i)return A[K];    else if(K>i)    {        return selete(A,L,K-1,i);    }    else    {        return selete(A,K+1,R,i-K);    }}int main(){    int A[100];    int i;    for(i=0;i<100;++i) A[i] = i+1;    randomshuffle(A,0,99);//随机排列,打乱顺序    cout<<"Init A:\n";    copy(A,A+99,ostream_iterator<int>(cout," "));    cout<<endl;    for(int i=0;i<100;++i)    {        cout<<i<<" th element: ";        cout<<selete(A,0,99,i)<<endl;    }    cout<<endl;}



[解决办法]
单步调试下
[解决办法]
C/C++ code
#include<iostream>#include<ctime>#include<iterator>using namespace std;int random(int p,int q){    time_t t;    srand((unsigned)time(&t));    return rand()%(q-p)+p;}int mid(int L,int R){    return L+(R-L)/2;}void swap(int &a,int&b){    int temp=a;    a=b;    b=temp;}void randomshuffle(int A[],int L,int R){    for(int i=L;i<R;i++)    {        int j=random(i,R);        swap(A[i],A[j]);    }}void insertsort(int A[],int L,int R){    for(int i=L+1;i<=R;i++)    {        int value=A[i];        int j=i-1;        while(j>=L&&A[j]>value)        {            A[j+1]=A[j];            j--;        }        A[j+1]=value;    }}int partition(int A[],int L,int R,int key){    //轴值的首尾标志    int leftIndex = L;    int rightIndex = R;    //快速排序的一轮    while (leftIndex < rightIndex)    {        //从右侧开始扫描若右侧数大于轴值则右侧标志位-1        while (leftIndex < rightIndex && A[rightIndex] > key)        {            rightIndex--;        }        //若右侧数小于轴值则交换右侧的数和左侧leftindex所指的数 并从左边开始比较        while (leftIndex < rightIndex && A[rightIndex] < key)        {            swap(A[leftIndex], A[rightIndex]);            leftIndex++;        }        //从左边开始比较若该数小于或等于轴值 则左侧标志位+1 注意一定要注意等于的情况        while (leftIndex < rightIndex && (A[leftIndex] < key || A[leftIndex] == key))        {            leftIndex++;        }        //从左边开始比较若该数比轴值大 则将该数和右侧标志位rightIndex对应的值交换并从右侧开始计算        while (leftIndex < rightIndex && A[leftIndex] > key)        {            swap(A[leftIndex], A[rightIndex]);            rightIndex--;        }        if (leftIndex >= rightIndex)        {            break;        }    }    //求key值对应的索引    return leftIndex;}int selete(int A[],int L,int R,int i){    if(R-L<5)    {        insertsort(A,L,R);        //cout<<A[L+i-1]<<"***";        return A[L+i-1];    }    int length=R-L+1;    int size=length/5,left,right;    for(int k=0;k<size;k++)    {        //计算每一组的起始索引        left=L+k*5;        //计算每一组的终止索引        right=left+4;        insertsort(A,left,right);        swap(A[L+k],A[left+2]);    }    //求中位数的中位数x    int x=selete(A,L,L+size-1,(size+1)/2);    //将数组分割成两组 返回该pivot的索引值    int M=partition(A,L,R,x);    int K=M-L+1;    //在前半部分 递归前部分    if(i<=K)    {        return selete(A,L,M,i);    }    else//在后半部分递归    {        return selete(A,M+1,R,i-K);    }}int main(){    int A[100];    int i;    for(i=0;i<100;++i)        A[i] = i+1;    randomshuffle(A,0,99);//随机排列,打乱顺序    cout<<"Init A:\n";    copy(A,A+100,ostream_iterator<int>(cout," "));    cout<<endl;    for(i=0;i<100;++i)    {        cout<<i<<" th element: ";        cout<<selete(A,1,100,i)<<endl;    }    cout<<endl;} 

读书人网 >C++

热点推荐