关于排序的问题!在线等待!

accp258 2003-01-14 04:20:11
有十个整数:88、66、55、100、99、77、89、33、68、90在从键盘另输入一个整数,求X在十个整数中排第几?(由小到大)
这个问题能不能给我写一个详细的步骤(分而治之),此题的程序如何编写??在线等待用C而不用,谢谢!!!!!!!!!
...全文
65 点赞 收藏 14
写回复
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
allen1981813 2003-02-26
我用随即数测试泛化
#include <ctime>
#include <iostream>
using namespace std;

int randNumber[10]={0};

int find(const int number,const int offset){
int count=0;
for(int i=0; i<sizeof randNumber/sizeof *randNumber; i++)
if(number>randNumber[i] )
count++;
return count+1;
}

void main(){
time_t tm;
srand((unsigned)time(&tm) );


for(int i=0; i<sizeof randNumber/sizeof *randNumber; i++)
randNumber[i]=rand();

int position;
for(i=0; i<sizeof randNumber/sizeof *randNumber; i++){
position=find(randNumber[i],i);
cout<<"Number:"<<randNumber[i]
<<" position:"<<position<<endl;
}
}
回复
billy_seamans(小禾晴雨) 和goodboy1881(三井) 的方法比较好,没必要排序,只需比较就可以了,效率高!!
回复
bugfree 2003-01-15
看这个帖子已经有几天了, 我的方法如下, 冒泡法排序中, 实时check已经有序部分, 如果符合条件 a[i]<data<=a[i+1] then break
The code is as below: f() is the needed function.

=====================
#include<iostream>
using namespace std;
//
// a: array start address, N: array size, D: data to search
// return: -1: error, >0 OK
//

int f(int *a, int N, int D)
{
int val=0;
for (int i=0; i<N; i++)
{
for(int j=i+1; j<N; j++)
{
if (a[i]>a[j]) swap(a[i], a[j]);

}
if (D < a[i] ) {
return i+1;
}
}
return -1;
};

int main()
{
int a[10]={88,65,55,100,99,77,89,33,68,90};
cout<<f(a, 10, 87)<<endl;
return 0;
}
回复
shornmao 2003-01-15
对不起,没看见你问的是需要定位。用堆排序不合适。
这种问题应该用HASH技术,寻找一个合适的线性递增的HASH函数,那么就可以达到你的要求了。
如果不计空间,只求速度,可以用简单的HASH法:
int pos[MAX_INT]={0};
int val;
int i=0;
cout<<"输入整数序列:\n";
while (cin>>val)
{
pos[val]=i++;
}
cout<<"输入整数:";
cin>>val;
cout<<"整数"<<val<<"位于第"<<pos[val]<<"个位置。\n"
回复
shornmao 2003-01-15
二分法要求已排序序列。
如果要在读取数据的时候就排序,以加快以后搜索的速度,那么可以采取堆排序。这是比较符合你的要求的。
回复
minijazz 2003-01-15
同意
楼主好像用c不能用iostream
换换就行啦
回复
prf8 2003-01-15
同意 shornmao(死猫) ;
回复
lizhiwo_wo 2003-01-15
循环就可以搞定嘛
回复
zalyer 2003-01-14
我觉得大家说的方法固然对,但是好像没有体现这道题的意思。应该有更好的方法,比如类似二分法,可以减少比较次数。但是我还没有想出什么好方法,我想应该利用读数时候就做点文章。
回复
accp258 2003-01-14
楼主非常同意anyoshon(好学)的建议!
回复
anyoshon 2003-01-14
赞同前面. 补充:
如果是程序中可能反复用到这个比较,我建议,先把这几个数从小到大排序,再把每次输入的数据,跟最小或者最大比较而得到排第几了.
回复
积木 2003-01-14
if(data>a[i])/*既然是从小到大,那么只要看它比几个数小就行了*/
^
|
注释写错了,应该是"小"字
回复
billy_seamans 2003-01-14
将这十个数存在数组中s[10],
初始化变量count为0,
然后对这个输入的数x,
依次和s[i]比较( i从0到9比较),
发现有比x小,则count加上1,

int count=0;
for(i=0;i<10;i++)
if(x>s[i]) count++;
最后得到的count的值就是x在序列中的序号了了
回复
积木 2003-01-14

/*88、66、55、100、99、77、89、33、68、90*/
/*这个题实现起来简单得很
只要你用一个int 变量 来记录有几个比它小就可以了,
一个for就搞定了*/
#include<stdio.h>
main()
{
int a[10]={88,65,55,100,99,77,89,33,68,90};
int m=1,i=0;
int data;
printf("plese enter the data:\n");
scanf("%d",&data);
for(i=0;i<=9;i++)
{
if(data>a[i])/*既然是从小到大,那么只要看它比几个数大就行了*/
{
m++;
}
}
printf("它在第%d位\n",m);
}
回复
发动态
发帖子
工具平台和程序库
创建于2007-09-28

2.4w+

社区成员

C/C++ 工具平台和程序库
申请成为版主
社区公告
暂无公告