注册 登录
编程论坛 C++教室

一个排序问题

xzghyd 发布于 2008-10-01 23:48, 647 次点击
有一个比较大的数组,从中取最大值,次大值,个数可以指定,如数组2 3 4 5 5 6  12 4 33 12 19 21 比如取5个数,则为33 21 19 12 12 要求原数组不可以改变
6 回复
#2
中学者2008-10-02 00:06
排个序,从后往前取啥~
#3
中学者2008-10-02 00:08
还有个思路(没验证过)
:
开个大的数组,然后进行映射统计...最后根据取得个数来二分....

感觉多半行不通.
#4
守鹤2008-10-02 00:11
可以利用动态开辟空间存取数据
#5
中学者2008-10-02 00:15
还可以利用链表....-,-
#6
xzghyd2008-10-02 00:43
这是我的算法
int * GetTop(const int *array,int size,int length)
{
    int *p=new int[length];         //开辟动态数组用于存储,并将被返回

    int i,j,k;
    int index=0,top=0,count=0;

    for(i=j=0;i<size;i++)
    {
        if(array[i] < array[j])
            j=i;
    }
    *p=array[j];                    //原数组的最大值存储在p

    for(k=1;k<length;k++)            //循环开始
    {
        index=*(p+k-1);
        top=k-1;
        count=0;                    

        while(top>=0)
        {
            if(index==*(p+top))
            {
                count++;
                top--;
            }
            else break;
        }                            //获取跳过次数

        i=j=0;
        while(1)
        {
            if(array[i] < *(p+k-1))
            {
                i++;
                j++;
            }
            else
                if(array[i] == *(p+k-1) && count>0)
                {
                    i++;
                    j++;
                    count--;
                }
                else break;
        }

        for(;i<size;i++)
        {
            if(array[i] < *(p+k-1))
                continue;
            else
                if(array[i] == *(p+k-1) && count>0)
                {
                    count--;
                    continue;
                }

            if(array[i] < array[j])
            {
                j=i;
            }
        }

        *(p+k)=array[j];
    }

    return p;
}

给这个函数传递数组名,数组大小,需要得到的个数

你门都没说怎么算?怒
#7
xzghyd2008-10-02 00:45
哎呀,发错了,这是求最小的,代码,晕了,下面是正确的
int * GetTop(const int *array,int size,int length)
{
    int *p=new int[length];         //开辟动态数组用于存储,并将被返回

    int i,j,k;
    int index=0,top=0,count=0;

    for(i=j=0;i<size;i++)
    {
        if(array[i]>array[j])
            j=i;
    }
    *p=array[j];                    //原数组的最大值存储在p

    for(k=1;k<length;k++)            //循环开始
    {
        index=*(p+k-1);
        top=k-1;
        count=0;                    

        while(top>=0)
        {
            if(index==*(p+top))
            {
                count++;
                top--;
            }
            else break;
        }                            //获取跳过次数

        i=j=0;
        while(1)
        {
            if(array[i] > *(p+k-1))
            {
                i++;
                j++;
            }
            else
                if(array[i] == *(p+k-1) && count>0)
                {
                    i++;
                    j++;
                    count--;
                }
                else break;
        }

        for(;i<size;i++)
        {
            if(array[i] > *(p+k-1))
                continue;
            else
                if(array[i] == *(p+k-1) && count>0)
                {
                    count--;
                    continue;
                }

            if(array[i]>array[j])
            {
                j=i;
            }
        }

        *(p+k)=array[j];
    }

    return p;
}
1