搜索
查看: 1664|回复: 8
打印 上一主题 下一主题

❤排序与搜索结合并加快搜索

[复制链接]
跳转到指定楼层
楼主
发表于 2012-8-6 13:47:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Spendour 于 2012-8-6 14:58 编辑

#include <stdio.h>
#include <stdlib.h>
int main()
{
        int  ctr=0,pai,pai2,te,id,so,duan=0;
        int s[10];
        int q[10] = {50,60,70,80,90,100,105,680,50,90};

        for (ctr=0;ctr<10;ctr++)
        {s[ctr] = (rand()%99)+1;} \\产生>100的随机数
        printf ("排序源\n");  \\ 输出准备进行排序的数组
        for (ctr=0;ctr<10;ctr++)
        {printf ( "%d ",s[ctr]);}

        for (pai=0;pai<9;pai++)      \\ 从大到小排序数组
        {
                for(pai2=pai;pai2<10;pai2++)
                {
                        if (s[pai]<s[pai2])
                        {
                                te=s[pai2];
                                s[pai2]=s[pai];
                                s[pai]=te;
                        }
                }
        }

        printf ("\n排序结果\n");
        for (ctr=0;ctr<10;ctr++)
        {
                printf ("%d ",s[ctr]);   \\ 输出排序好的数组
        }
        
        printf ("\n排序完毕,请输入ID\n");
        scanf("%d",&id);  \\等待用户输入ID 进行搜索
        printf ("搜索中...\n");

        for(so=0;so<10;so++)
        {
                if(id==s[so])  
                {
                        printf("欢迎ID %d ",s[so]);
                        duan=1;  \\ 在下面的 if(duan==1) 进行判断用
                        break;
                }
                if(id>s[so])  \\ 当前值与用户输入的值进行比较 如果 用户输入值 比 当前值 大则结束循环
                {
                        printf("ID %d 不存在请核实\n",id);
                        break;
                }
        }

        if(duan==1) \\ duan=0(表示未搜索到ID 跳过下面代码) duan=0 (表示搜索到DI执行下列代码)
        {
                printf("\n正在查询ID%d资金",id);
                if(q[so]>100)  \\ 判断q[so]是否大于100
                {
                        printf("\n您已经欠费%d,请还清后在试",q[so]);
                }
                else
                {
                        printf("\n您已经欠费%d,未超过额定资金可以使用\n",q[so]);
                }
        }

        return 0;  

}


\* 注释可不是一件简单的事哇  *\
沙发
发表于 2012-8-6 14:12:01 | 只看该作者
无论你是排序前还是排序后 时间复杂度都是ON 没有任何区别 没有搞懂楼主什么意思。。。
板凳
 楼主| 发表于 2012-8-6 14:36:14 | 只看该作者
这是在书上 看到的一个方法

假如没有排序的数组有上千或上万个  搜索数组的时候是要把这上千或上万个数组逐个搜索完才可以知道这个数组是否存在。

然而排序过后的数组顺序是从小(从大)排序过来的吧,程序每次搜索的时候都进行计较 如果用户输入的值小于(大于)当前搜索的值那么程序就可以断定这个值是不存在的了,那么程序就可以提早结束搜索 这样速度也提升了。





地板
 楼主| 发表于 2012-8-6 14:38:00 | 只看该作者
回遗未来 发表于 2012-8-6 14:12
无论你是排序前还是排序后 时间复杂度都是ON 没有任何区别 没有搞懂楼主什么意思。。。

汗发错地方了

这是在书上 看到的一个方法

假如没有排序的数组有上千或上万个  搜索数组的时候是要把这上千或上万个数组逐个搜索完才可以知道这个数组是否存在。

然而排序过后的数组顺序是从小(从大)排序过来的吧,程序每次搜索的时候都进行计较 如果用户输入的值小于(大于)当前搜索的值那么程序就可以断定这个值是不存在的了,那么程序就可以提早结束搜索 这样速度也提升了。
5#
发表于 2012-8-6 14:40:03 来自手机 | 只看该作者
如果你想让别人和自已更了解C的时候就开始写注释吧!除非你达到不写注释人家一眼就明白那行是啥意思时就不用写注释了…
6#
 楼主| 发表于 2012-8-6 14:41:29 | 只看该作者
hjx1120 发表于 2012-8-6 14:40
如果你想让别人和自已更了解C的时候就开始写注释吧!除非你达到不写注释人家一眼就明白那行是啥意思时就不用 ...

.....  忘了  
7#
发表于 2012-8-6 18:15:46 | 只看该作者
Spendour 发表于 2012-8-6 14:38
汗发错地方了

这是在书上 看到的一个方法

表示没有看懂你的意思~~~囧   我这是ON的算法  是需要扫描一次  而你排序就N方的复杂度了
8#
 楼主| 发表于 2012-8-6 20:00:07 | 只看该作者
回遗未来 发表于 2012-8-6 18:15
表示没有看懂你的意思~~~囧   我这是ON的算法  是需要扫描一次  而你排序就N方的复杂度了

虽然看起来是很夸张,但要搜索一些大量的数据就很有效了。
9#
发表于 2012-8-7 08:34:40 | 只看该作者
Spendour 发表于 2012-8-6 20:00
虽然看起来是很夸张,但要搜索一些大量的数据就很有效了。

你还没有明白我的意思   我只需要对这个数组扫描一次 答案就可以出来 而你 一旦开始排序就是N方的数量级运算量  指数级的变化
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表