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

一.生成随机数组

     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. Android抽屉菜单DrawerLayout的实现案例

    (1)项目布局文件 activity_main.xml <android.support.v4.widget.DrawerLayout xmlns:android="http://sc ...

  2. LLDB 常用命令

    dump: memory read --force --outfile [文件名] --binary [start_address] [end_address] 查找函数地址: 对于有调试符号的这样使 ...

  3. Parallel and Perpendicular

    题目链接 题意: 输入n,求正n边形中的对角线1和对角线2的个数(对角线1:至少与其它一个对角线平行:对角线2:至少与其它一个对角线垂直).对角线不能是多边形的边 (4 ≤ n ≤ 10e5) 分析: ...

  4. ping测试局域网内主机是否alive

    [root@zabbix ~]# cat alivehost.sh #!/bin/bash #Checks to see if hosts 192.168.1.100-192.168.1.200 ar ...

  5. ios2--UIView的常见属性

    // // ViewController.m // 06-UIView的常见属性 // #import "ViewController.h" @interface ViewCont ...

  6. oc69--NSMutableString

    // main.m // NSMutableString基本概念,NSString是不可变字符串,NSMutableString是可变字符串.NSMutableString继承NSString,所以N ...

  7. Android 触摸提示音【转】

    本文转载自:http://blog.csdn.net/Jin_HeZai/article/details/46791567 近期任务,涉及Android触摸提示音. 首先,定位源码目标.很显然的,在原 ...

  8. JavaScript Patterns 1 Introduction

    1.1 Pattern "theme of recurring events or objects… it can be a template or model which can be u ...

  9. Hyper-v 3.0 安装centos6.3

    Hyper-v 3.0 安装centos6.3 我们说到hyper-v3.0就想到了windows8.windows2012:我们也知道在windows8.windows2012上安装centos系统 ...

  10. JAVA基础(多线程Thread和Runnable的使用区别(转载)

    转自:http://jinguo.iteye.com/blog/286772 Runnable是Thread的接口,在大多数情况下“推荐用接口的方式”生成线程,因为接口可以实现多继承,况且Runnab ...