(C/C++学习)11.随机数组的快速查找
说明:利用随机函数生成一个随机数组,然后对数组进行排列,再利用二分查找快速查找一个数。
一.生成随机数组
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.随机数组的快速查找的更多相关文章
- hash数组快速查找一个字符串中出现最多的字符,并统计出现的次数
如何快速查找一个字符串中出现最多的字符,并统计出现的次数? 可以使用hash数组,也就是关联数组实现快速查找功能. function seek(str) { var hash = []; var ma ...
- Javascript经典算法学习1:产生随机数组的辅助类
辅助类 在几个经典排序算法学习部分,为方便统一测试不同算法,新建了一个辅助类,主要功能为:产生指定长度的随机数组,提供打印输出数组,交换两个元素等功能,代码如下: function ArraySort ...
- 给深度学习入门者的Python快速教程 - numpy和Matplotlib篇
始终无法有效把word排版好的粘贴过来,排版更佳版本请见知乎文章: https://zhuanlan.zhihu.com/p/24309547 实在搞不定博客园的排版,排版更佳的版本在: 给深度学习入 ...
- 给深度学习入门者的Python快速教程
给深度学习入门者的Python快速教程 基础篇 numpy和Matplotlib篇 本篇部分代码的下载地址: https://github.com/frombeijingwithlove/dlcv_f ...
- 给深度学习入门者的Python快速教程 - 番外篇之Python-OpenCV
这次博客园的排版彻底残了..高清版请移步: https://zhuanlan.zhihu.com/p/24425116 本篇是前面两篇教程: 给深度学习入门者的Python快速教程 - 基础篇 给深度 ...
- Java编程思想学习(十二) 数组和容器
一.数组 1).数组的多种初始化方式 下面总结了初始化数组的多种方式,以及如何对指向数组的引用赋值,使其指向另一个数组对象.值得注意的是:对象数组和普通数组的各种操作基本上都是一样的:要说有什么不同的 ...
- (私人收藏)[开发必备]最全Java离线快速查找手册(可查询可学习,带实例)
(私人收藏)[开发必备]最全Java离线快速查找手册(可查询可学习,带实例) https://pan.baidu.com/s/1L54VuFwCdKVnQGVc8vD1TQnwmj java手册 Ja ...
- JavaScript 实现彩票中随机数组的获取
1.效果图: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- JavaScript学习11 数组排序实例
JavaScript学习11 数组排序实例 数组声明 关于数组对象的声明,以前说过:http://www.cnblogs.com/mengdd/p/3680649.html 数组声明的一种方式: va ...
随机推荐
- BZOJ 2338 HNOI2011 数矩形 计算几何
题目大意:给定n个点,求一个最大的矩形,该矩形的四个顶点在给定的点上 找矩形的方法是记录全部线段 若两条线段长度相等且中点重合 这两条线段就能够成为矩形的对角线 于是我们找到全部n*(n-1)/2条线 ...
- 2015南阳CCPC G - Ancient Go dfs
G - Ancient Go Description Yu Zhou likes to play Go with Su Lu. From the historical research, we fou ...
- Ajax之XMLHttpRequst对象
XMLHttpRequest对象提供客户端与Http服务器异步通信的协议.通过该协议,Ajax可以使页面像桌面应用程序一样,只同服务器进行数据层的交换,而不用每次都刷新页面,也不用每次将数据处理工作提 ...
- Selenium中配置链接使用FTP服务
Enable the default report solution Step1: Create a suite listener and add codes into it, please watc ...
- java的PrintStream(打印输出流)详解(java_io)
java的PrintStream(打印输出流)详解(java_io) 本章介绍PrintStream以及 它与DataOutputStream的区别.我们先对PrintStream有个大致认识,然后再 ...
- Hadoop - WordCount代码示例
文章来源:http://www.itnose.net/detail/6197823.html import java.io.IOException; import java.util.Iterator ...
- 慕课网3-10编程练习:简单的flex布局
小伙伴们,我们学习了伸缩容器的一些属性,接下来使用我们所学的伸缩容器属性完成下面的效果图. 完成效果: 任务 1.先将容器设置为伸缩容器 2.在垂直方向上对齐,行与行之间的空白距离一样 3.在水平方向 ...
- 拼接sql ()
SELECT ID,FORMNAME,NODENAME,SEQUENCE, NAME, STATE, NOWTIMES, WORK.FQREALNAME||'('||FQDEPT.FULLN ...
- 为什么现在改用int.TryParse了
以前一直用 int.Parse(x)或者 Convert.ToInt64(x),后来项目中发现如果x变量的值为null是,就报错了,哪怕我这样写 int.Parse(x=x??"0" ...
- linux,apache,mysql,php常用查看版本信息的方法
1. 查看linux的内核版本,系统信息,常用的有三种办法: uname -a; cat /proc/version; -bash-4.2$ uname -a Linux apphost -.el7. ...