首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

二次取中规则的选择算法,求矫正,运用二次取中求第K小元素解决办法

2012-02-29 
二次取中规则的选择算法,求矫正,运用二次取中求第K小元素算法结果有些错误,求高手给调一下,算法描述:Selec

二次取中规则的选择算法,求矫正,运用二次取中求第K小元素
算法结果有些错误,求高手给调一下,算法描述:Select2(vector<int>&A,int k),从数组A中求第K小元素。
现将A中元素分成 A.size()/r 份,每份 r个元素,其中r=5

每5个一组,分别求出每组中中间元素,

再将这些元素在组成一组,递归调用,求出A中的 一个接近中间值的元素作为划分元素。

并用Partition()来求此元素的下标+1的值,若等于K则找到并返回,如果比J大,递归调用Select2,若比J小,递归调用Select2()

C/C++ code
#include <iostream>#include <vector>using namespace std;const int r = 5;void insertsort(vector<int> &vint)//快速插入排序{    int j=0;    int temp;    for(int i=1;i!=vint.size();i++)    {        //a[0]=a[i];        temp=(vint)[i];        j=i- 1;        while(j>=0 && temp<(vint)[j])        {            (vint)[j+1]=(vint)[j];            j--;        }         (vint)[j+1]=temp;    }}//快速排序分类,俺temp的值将A中的值分为两部分,第一部分小于temp,第二部分大于等于temp最后返回temp在A的下表+1的位置int Partition(vector<int> &A,int temp){    int p=A.size()-1;    int v ;    int i=1;    while(true)    {        while(true)        {                    if(i<p&&A[i]<temp)                    ++i;                else                    break;        }        while(true)        {                if(A[p]>temp&&p>=0)                    --p;                else                    break;        }        if(i<p)        {                v =A[i];            A[i]=A[p];            A[p]=v;        }        else            return (p);    }        }int Select2( vector<int>& A,int k){        if(A.size()<=r)    {        insertsort(A);        return A[k-1];    }    vector<int> M ;    for(int i=0;i<=(A.size()-5);i+=5)    {        if((i+5)>A.size())            break;        vector<int> m;        m.push_back(A[i]);        m.push_back(A[i+1]);        m.push_back(A[i+2]);        m.push_back(A[i+3]);        m.push_back(A[i+4]);        insertsort(m);        (M).push_back((m)[2]);    }    int v ;    if((A.size()/r)%2 ==1)         v = Select2(M,(1+(A.size()/r)/2));    else        v = Select2(M,(A.size()/r)/2);    int j = Partition(A,v) ;//    cout<<"中间值下标为:"<<(j-1)<<"划分值为:"<<v<<endl;     if(k== j)        return v;    else if(k<j)        {            vector<int> A1  ;            for(int i=0;i!=j-1;++i)                (A1).push_back(A[i]);            return Select2(A1,k);// K比J小在A[0]-A[j-2]中求第K小元素                        }    else        {            vector<int> A2;            for(int i=j;i!=(A).size();++i)                (A2).push_back(A[i]);            return Select2(A2,k-j);//K比J大,在A[j] --- A[A.size()-1]中求第K-J小元素。。        }            }int main(){    vector<int> A ,Aa;    for(int i=0;i!=100;++i)    {        A.push_back((int)rand());        Aa.push_back(A[i]);    }            insertsort(Aa);    cout<<"501个数中求第K小元素"<<endl;     cout<<"输入要找的第K小元素:";    int k=4;    for(int k=1;k!=A.size()+1;++k)    {        cout<<Select2(A,k)<<"==?"<<Aa[k-1]<<"插入排序求第K小元素,验证上述算法结果."<<k<<endl;    }    system("pause");    return 0;}


[解决办法]
else if(k<j){
vector<int> A1 ;
for(int i=0;i!=j-1;i++)
(A1).push_back(A[i]);
return Select2(A1,k);// K比J小在A[0]-A[j-2]中求第K小元素
}

应该是, K比J小在A[0]-A[j-1]中求第K小元素
C/C++ code
    else if(k<j){            vector<int> A1  ;            for(int i=0;i<=j-1;i++)                (A1).push_back(A[i]);            return Select2(A1,k);// K比J小在A[0]-A[j-2]中求第K小元素                        } 

热点排行