说明:利用随机函数生成一个随机数组,然后对数组进行排列,再利用二分查找快速查找一个数。

一.生成随机数组

     time_t   ts;
//等价于long ts;
unsigned int num = time(&ts);
srand(num);
int a[10] = {0};
for(int i = 0;i<10;i++)
a[i] = rand()%100;

注意:sizeof(long) = sizeof(unsigned int) = sizeof(time_t) = 4。上述代码也可以用以下代码代替:

     srand(time(NULL));
int a[10] = {0};
for(int i = 0;i<10;i++)
a[i] = rand()%100;

二.对数组进行排列

在上一节已经叙述过快速排序的原理了,这里不再过多讲解,直接上迭代法排序代码。

 void sortlist(int *p,int low,int high)
{
if(low < high)
{
int l = low;
int h = high;
int middle = p[low];
while(l<h)
{
while(p[h] >= middle && l<h)
h--;
p[l] = p[h];
while(p[l] <= middle && l<h)
l++;
p[h] = p[l];
}
p[h] = middle;
sortlist(p,low,h-1);
sortlist(p,h+1,high);
}
}

其中 p 为数组名,LOW为 0 ,high为数组元素个数减 1。

三.二分法快速查找

二分法查找适用于查找数据量相当大的数据库,且要求数据有序。假如对于一个有一千个数的有序数组,利用二分法查找一个数据,第一次即可筛选掉500个数据,第二次即可筛选掉250个数据,以此类推。其代码实现如下:

 int binarysearch(int *p,int low,int high,int data)
{
if(low <= high)
{
int middle = (low + high)/2;
if(data == p[middle])
{
int midh = middle;
int midl = middle;
while(p[++midh] == data)
printf("%d %d\n",midh,p[midh]);
while(p[--midl] == data)
printf("%d %d\n",midl,p[midl]);
return middle;
}
else if(data > p[middle])
return binarysearch(p,middle+1,high,data);
else
return binarysearch(p,low,middle-1,data);
}
return -1;
}

四.最后上一个示例,代码功能是生成一个随机数组,对其采用迭代法进行排序,然后利用二分法查找一个数据。

 #include<stdio.h>
#include<time.h>
#include<stdlib.h>
void travelllist(int *p,int n)
{
int i = 0;
for(;i<n;i++)
printf("%d ",p[i]);
putchar(10);
} void sortlist(int *p,int low,int high)
{
if(low < high)
{
int l = low;
int h = high;
int middle = p[low];
while(l<h)
{
while(p[h] >= middle && l<h)
h--;
p[l] = p[h];
while(p[l] <= middle && l<h)
l++;
p[h] = p[l];
}
p[h] = middle;
sortlist(p,low,h-1);
sortlist(p,h+1,high);
}
} int binarysearch(int *p,int low,int high,int data)
{
if(low <= high)
{
int middle = (low + high)/2;
if(data == p[middle])
{
int midh = middle;
int midl = middle;
while(p[++midh] == data)
printf("%d %d\n",midh,p[midh]);
while(p[--midl] == data)
printf("%d %d\n",midl,p[midl]);
return middle;
}
else if(data > p[middle])
return binarysearch(p,middle+1,high,data);
else
return binarysearch(p,low,middle-1,data);
}
return -1;
} int main()
{
int i;
srand(time(NULL));
int arr[100] = {0};
for( i = 0;i<100;i++)
arr[i] = rand() % 100;
travelllist(arr,100);
sortlist(arr,0,99);
travelllist(arr,100);
int data = binarysearch(arr,0,99,3);
if(data >= 0)
printf("%d %d",data,arr[data]);
else
printf("find nothing!!");
return 0;
}

查看代码

(C/C++学习)11.随机数组的快速查找的更多相关文章

  1. hash数组快速查找一个字符串中出现最多的字符,并统计出现的次数

    如何快速查找一个字符串中出现最多的字符,并统计出现的次数? 可以使用hash数组,也就是关联数组实现快速查找功能. function seek(str) { var hash = []; var ma ...

  2. Javascript经典算法学习1:产生随机数组的辅助类

    辅助类 在几个经典排序算法学习部分,为方便统一测试不同算法,新建了一个辅助类,主要功能为:产生指定长度的随机数组,提供打印输出数组,交换两个元素等功能,代码如下: function ArraySort ...

  3. 给深度学习入门者的Python快速教程 - numpy和Matplotlib篇

    始终无法有效把word排版好的粘贴过来,排版更佳版本请见知乎文章: https://zhuanlan.zhihu.com/p/24309547 实在搞不定博客园的排版,排版更佳的版本在: 给深度学习入 ...

  4. 给深度学习入门者的Python快速教程

    给深度学习入门者的Python快速教程 基础篇 numpy和Matplotlib篇 本篇部分代码的下载地址: https://github.com/frombeijingwithlove/dlcv_f ...

  5. 给深度学习入门者的Python快速教程 - 番外篇之Python-OpenCV

    这次博客园的排版彻底残了..高清版请移步: https://zhuanlan.zhihu.com/p/24425116 本篇是前面两篇教程: 给深度学习入门者的Python快速教程 - 基础篇 给深度 ...

  6. Java编程思想学习(十二) 数组和容器

    一.数组 1).数组的多种初始化方式 下面总结了初始化数组的多种方式,以及如何对指向数组的引用赋值,使其指向另一个数组对象.值得注意的是:对象数组和普通数组的各种操作基本上都是一样的:要说有什么不同的 ...

  7. (私人收藏)[开发必备]最全Java离线快速查找手册(可查询可学习,带实例)

    (私人收藏)[开发必备]最全Java离线快速查找手册(可查询可学习,带实例) https://pan.baidu.com/s/1L54VuFwCdKVnQGVc8vD1TQnwmj java手册 Ja ...

  8. JavaScript 实现彩票中随机数组的获取

    1.效果图: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  9. JavaScript学习11 数组排序实例

    JavaScript学习11 数组排序实例 数组声明 关于数组对象的声明,以前说过:http://www.cnblogs.com/mengdd/p/3680649.html 数组声明的一种方式: va ...

随机推荐

  1. JpGraph中文乱码问题解决

    JpGraph是一个PHP的图形类库,可以方便地生成各种柱状图,饼图,折线图等等,而且还可以方便地加文字.但是,中文的情况就稍微麻烦了一点.在JpGraph中默认是要把字符串转成utf8的,但是如果你 ...

  2. Zookeeper01

    ZooKeeper数据模型Znode

  3. touch事件的分发机制

    作者:谢昆 一段伪代码反应整个touch事件的分发 public boolean dispatchTouchEvent(MotionEvent event) { boolean consume = f ...

  4. PCB SQL SERVER 位运算应用实例

    在PCB行业,一个产品可能同时在多个工厂生产,举例:一个产品一条主记录,这条记录中会对应多个工厂的产地,而这个工厂产地个数不确定, 那么如何设计表结构存储这个不确定的工厂呢?这里想到了4个方式存储 一 ...

  5. THE DRUNK JAILER

    http://poj.org/problem?id=1218 题意:门的状态有两种开或关,初始化为开,每次进行状态转换,第一次把门号是1的倍数的门状态转换,第二次把门号是2的倍数的门状态转换,.... ...

  6. Text段、Data段和BSS段

    不同的compiler在编译的过程中对于存储的分配可能略有不同,但基本结构大致相同. 大体上可分为三段:Text段.Data段和BSS段. text段用于存放代码,通常情况下在内存中被映射为只读,但d ...

  7. php排序函数测试

    1.sort,asort,arsort函数 十万个数的数组排序,用了0.17秒 $starttime=explode(' ',microtime());;for ($i=0; $i <10000 ...

  8. 基于行为树的AI 与 Behavior Designer插件

    优点:    0.行为逻辑和状态数据分离,任何节点都可以反复利用.    1.高度模块化状态,去掉状态中的跳转逻辑,使得状态变成一个"行为".    2."行为" ...

  9. SpringBoot入门之HelloWorld

    1.SpringBoot简介 百度百科:Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而 ...

  10. EF--ModelFirst

    EF框架有三种基本的方式:DB First,Model First,Code First.这里简单的说一下Model First,适合没有基础的同学照着做,学习基础的东西. 1.建立一个类库项目,这个 ...