编程论坛
注册
登录
编程论坛
→
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
xzghyd
2008-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
xzghyd
2008-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