【循环搜寻法(使用卫兵)】

/*
循环搜寻法(使用卫兵)
说明:
搜寻的目的,是在「已排序的资料」中寻找指定的资料,而当中循序搜寻是最基本的搜寻法,只要从资料开头寻找到最后,看看是
否找到资料即可。
解法:
初学者看到循序搜寻,多数都会使用以下的方式来进行搜寻:

while(i < MAX){
    if(number[i] == k){
        printf("找到指定值");
        break;
    }
    i++;
}

这个方法基本上没有错,但是可以加以改善,可以利用设定卫兵的方式,省去if判断式,卫兵通常设定在数列最后或是最前方,假设
设定在列前方好了(索引0的 位置),我们从数列后方向 前找,如果找到指定的资料时,其索引值不是0,表示在数列走访完之前就
找到了,在程式的撰写上,只要使用一个while回圈就可 以了。下面的程式为了配合卫兵的设置,自行使用快速排序法先将产生的数
列排序,然后才进行搜寻 ,若只是数字的话,通常您可以使用程式语言函式库所提供的搜寻函式.
*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define MAX 10
#define SWAP(x, y) {int t; t = x; x = y; y = t;}

int search(int []);
int partition(int [], int, int);
void quicksort(int [], int, int);

int main(void){
    int number[MAX+1] = {0};
    int i, find;

    srand(time(NULL));

    for(i = 1; i <= MAX; i++){
        number[i] = rand() % 100;
    }

    quicksort(number, 1, MAX);

    printf("数列:");
    for(i = 1; i <= MAX; i++){
        printf("%d ", number[i]);
    }

    printf("\n输入搜寻值: ");
    scanf("%d", &number[0]);

    if(find = search(number)){
        printf("\n找到数值索引 %d ", find);
    }else{
        printf("\n找不到数值");
    }

    printf("\n");

    return 0;
}

int search(int number[]){
    int i, k;
    k = number[0];
    i = MAX;

    while(number[i--] != k);return i;
}

int partition(int number[], int left, int right){
    int i, j, s;

    s = number[right];
    i = left - 1;

    for(j = left; j < right; j++){
        if(number[j] <= s){
            i++;
            SWAP(number[i], number[j]);
        }
    }

    SWAP(number[i+1], number[right]);
    return i+1;
}

void quicksort(int number[], int left, int right){
    int q;

    if(left < right){
        q = partition(number, left, right);
        quicksort(number, left, q-1);
        quicksort(number, q + 1, right);
    }
}

运行结果:

时间: 2024-11-05 19:14:03

【循环搜寻法(使用卫兵)】的相关文章

for循环枚举法,全排列+dfs,补充浮点数注意事项

其实这个题目我一直没想好应该叫什么,就是在做蓝桥杯的时候会遇到很多的题,给你一等式,abcdef...分别是1-9(||12||15)不重复问你有几种方案? 我之前一直都是用的for循环在做,听说这叫什么暴力破解还是枚举法的.小白不是很懂这些. 但是之前做过一道题,好像就是15个数的for循环写的,一个是巨累(因为我用a!=b&&a!=c&&a!=....真的特别多而且容易写错),另一个是我记得我这道题写了很久最后提交没有分数,因为!!!超时了!!! 真的特别气,当时的我只

【经典算法大全】收集51种经典算法 初学者必备

<经典算法大全>是一款IOS平台的应用.里面收录了51种常用算法,都是一些基础问题.博主觊觎了好久,可悲哀的是博主没有苹果,所以从网上下了老奔的整理版并且每个都手敲了一遍. 虽然网上也有博客贴了出来,但是自己写写感觉总是好的.现在分享个大家. 代码和运行结果难免有出错的地方,请大家多多包涵. 1.河内之塔(汉诺塔) 2.费式数列 3.巴斯卡三角形 4.三色棋 5.老鼠走迷宫(1) 6.老鼠走迷宫(2) 7.骑士走棋盘 8.八皇后 9.八枚银币 10.生命游戏 11.字串核对 12.双色河内塔,

经典算法大全

原文地址:经典算法大全 作者:liurhyme 经                                                                    典                                                                    算                                                                    法                  

【实验室笔记】关于数据帧头的搜寻的一点想法

在上下位机的串口通讯中,数据传送协议是十分重要的.能不能准确找到一帧数据的帧头数据是保证能否正确建立数据传送的根本保证. 实验总结了一个相对简单的办法,没有复杂的搜寻办法,但是很实用. 大概的思想是假设数据帧的长度是30个字节(包含了帧头帧尾),那么上位机端放进来的缓存数据长度就设置成为60字节,两倍的关系.然后要做的工作是在前30个字节中搜寻数据帧头的位置,采用循环搜寻的办法.当找到帧头的首字节位置后,另外经判断帧头数据正确无误,那么就可以记住帧头首字节的地址了,然后相对于既定的位置关系确定每

什么是回溯法?

回溯法是分治穷举搜索的一个方法.有点绕人,我复制wiki的解释如下: 回溯法(英语:backtracking)是暴力搜寻法中的一种. 回溯法采用试错的思想,它尝试分步的去解决一个问题.在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试寻找问题的答案. 对于一个问题又是后尝试所有的可能才是最好的办法. 这会导致解决过程很慢,我们还是有一些标准化的工具的. 例如:对于基本问题,二进制序列(n位的二

【转】编程词汇

很实用的编程英语词库,共收录一千五百余条词汇. 第一部分: application 应用程式 应用.应用程序 application framework 应用程式框架.应用框架 应用程序框架 architecture 架构.系统架构 体系结构 argument 引数(传给函式的值).叁见 parameter 叁数.实质叁数.实叁.自变量 array 阵列 数组 arrow operator arrow(箭头)运算子 箭头操作符 assembly 装配件 assembly language 组合语

常用的英语

standby  备用 Master.slave 主服务器.从服务器 curator 馆长; 监护人; 管理者 failover 故障转移 patch 补丁 multicore 多核 asynchronous 异步 consistency 一致性 availability 可用性 tolerance 容错性 acquire 获取 persistent 持久 ephemeral 临时 sequential 有序 lifetime 生命周期 watch 监视点 notification 通知 ACL

java 经典算法(转)

1.河内之塔.. 2.Algorithm Gossip: 费式数列. 3. 巴斯卡三角形 4.Algorithm Gossip: 三色棋 5.Algorithm Gossip: 老鼠走迷官(一) 6.Algorithm Gossip: 老鼠走迷官(二) 7.Algorithm Gossip: 骑士走棋盘 8.Algorithm Gossip: 八皇后 9.Algorithm Gossip: 八枚银币. 10.Algorithm Gossip: 生命游戏. 11.Algorithm Gossip:

【转】Java 专业词汇

原址:http://blog.csdn.net/xiaojunjuns1/article/details/52729861 abstract (关键字)             抽象 ['.bstr.kt] access                            vt.访问,存取 ['.kses]'(n.入口,使用权) algorithm                     n.算法 ['.lg.riem] annotation                     [Java