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

一.生成随机数组

     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. 苹果官方Instruments工具之Automation的介绍

    instruments中国的工具測试有非常多,包含非常多方面.eg:内存泄露的測试.网络连接.和cpu内存的使用情况一系列数据的图形界面的显示. 功能的介绍能够看以下的截图图片: watermark/ ...

  2. ERROR (ConnectionError): HTTPConnectionPool (Caused by &lt;class &#39;socket.error&#39;&gt;: [Errno 111] Connecti

    感谢朋友支持本博客.欢迎共同探讨交流,因为能力和时间有限,错误之处在所难免.欢迎指正! 假设转载,请保留作者信息. 博客地址:http://blog.csdn.net/qq_21398167 原博文地 ...

  3. 大话设计模式宏观总结——创建型&amp;结构型&amp;行为型

    师傅验收项目的时候.问大话设计模式那三种类型的差别和联系是什么,顿时我傻了眼.由于除了知道这三种类型分别如何称呼以外.从来都没想过为什么这样划分?于是,我便回答:我没想过这个问题.若是从字面上来理解的 ...

  4. MySQL5.6 GTID方式,配置主从

    迁移数据到从库 数据导出: mysqldump -uroot -p111111 -h127. -P3306 -q --single-transaction -R -E --triggers --def ...

  5. 【SQL Server】SQL触发器经验详解

    [SQL Server]SQL触发器经验详解 | 浏览: 4314 | 更新: 2013-01-07 15:33 25 11 全文阅读分步阅读   加入杂志 步骤 1 2 3 4 5 6 7 8   ...

  6. Kubernetes——基于容器技术的分布式架构领先方案,它的目标是管理跨多个主机的容器,提供基本的部署,维护以及运用伸缩

    1.Kubernetes介绍 1.1 简介 Kubernetes是什么?首先,它是一个全新的基于容器技术的分布式架构领先方案.其次,它是一个开放的开发平台.最后,它是一个完备的分布式系统支撑平台.Ku ...

  7. B4197 [Noi2015]寿司晚宴 状压dp

    这个题一开始想到了唯一分解定理,然后状压.但是显然数组开不下,后来想到每个数(n<500)大于19的素因子只可能有一个,所以直接单独存就行了. 然后正常状压dp就很好搞了. 题干: Descri ...

  8. openstack instance resize to rebuild

  9. 数据库异常 :java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)

    最近在新项目中突然出现了  java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES) ...

  10. 【Java设计模式】工厂模式

    简单工厂模式 简单工厂模式不是23种里的一种,简而言之,就是有一个专门生产某个产品的类.比如下图中的鼠标工厂,专业生产鼠标,给参数0,生产戴尔鼠标,给参数1,生产惠普鼠标. 示例代码: //一个产品接 ...