quicksort+binarySearch
描述
数轴上有n个点,对于任一闭区间 [a, b],试计算落在其内的点数。 输入
第一行包括两个整数:点的总数n,查询的次数m。 第二行包含n个数,为各个点的坐标。 以下m行,各包含两个整数:查询区间的左、右边界a和b。 输出
对每次查询,输出落在闭区间[a, b]内点的个数。 Example
Input Output 限制
≤ n, m ≤ × 对于次查询的区间[a, b],都有a ≤ b 各点的坐标互异 各点的坐标、查询区间的边界a、b,均为不超过10^7的非负整数 时间: sec 内存: MB
终于解决了《范围查询》算法这一题了,100分通过,得瑟一下! 经历了55分,45分,0分,runtime error的越改越少的怪圈,在此说下心得:
先scanf再用new来保存数组的输入值long;然后快速排序;
然后用二分查找,分别找左边界,右边界不同的情况
如果左边界为其中某个数a[i],则说明不包含的个数为i
如果右边界为其中某个数a[i],则说明包含的个数为i+1
用右边界包含的个数减去左边界不包含的个数,就是[a,b]内的个数
还有一种情况是边界点不在坐标数组中,也好分析。
找不到那个数,最后一步情况就是low=middle=high,循环退出时是low>high。也可以算出左边不包含和右边包含的数的个数
用的VC6++,个人觉得关键点有: ,scanf, new long[n], quickSort, binarySearch, delete[]
#include <cstdio>
//#include <stdlib.h>
//二分查找 long binary_search(long* a, long len, long goal);
void quicksort(long *a, long left, long right); //左边界T,右边界F
long binary_search(long* a, long len, long goal, bool t)
{
long low = ;
long high = len - ;
long middle; while(low <= high)
{
middle = (low + high)/;
if(goal == a[middle])
{
return (t ? middle: middle+);
}
else if(goal < a[middle])//在左半边
high = middle - ; else//在右半边
low = middle + ;
}//low>high
if(goal < a[middle])
return middle;
else//if (goal > a[middle])
return middle + ;
} void quicksort(long *a, long left,long right)
{
long i,j,t,temp;
if(left>right)
return; temp=a[left]; //temp中存的就是基准数
i=left;
j=right;
while(i<j)
{
//顺序很重要,要先从右边开始找 小于基数的数
while(a[j]>=temp && i<j)
j--;
//再找左边的大于基数的数
while(a[i]<=temp && i<j)
i++;
//交换两个数在数组中的位置
if(i<j)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
//最终将基准数归位
a[left]=a[i];
a[i]=temp; quicksort(a,left,i-);//继续处理左边的,这里是一个递归的过程
quicksort(a,i+,right);//继续处理右边的 ,这里是一个递归的过程
} int main(void)
{
long num, cmd;
long i,ret1,ret2; scanf("%ld %ld",&num,&cmd); //long *n = (long*)malloc(num*4);
long *n = new long[num];
for (i=;i<num;i++)
scanf("%ld ",n+i); //long *src = (long*)malloc(cmd*4);
//long *des = (long*)malloc(cmd*4);
long *src = new long[cmd];
long *des = new long[cmd]; for (i=;i<cmd;i++)
scanf("%ld %ld",src+i,des+i); quicksort(n, , num-); /* for (i=0;i<num;i++)
printf("%d ",n[i]);*/ for (i=;i<cmd;i++)
{
ret1=binary_search(n,num,src[i],true);//find in n[], length num, goal src[i]
ret2=binary_search(n,num,des[i],false);
printf("%ld\n",ret2-ret1);
} delete[] n;
delete[] src;
delete[] des;
return ;
}
quicksort+binarySearch的更多相关文章
- 折半查找,binarySearch
折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务.它的基本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比 ...
- 现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
欢迎大家加入我的社区:http://t.csdn.cn/Q52km 社区中不定时发红包 文章目录 1.UML类图 2.源码: 3.优缺点分析 1.UML类图 2.源码: package com.bac ...
- quickSort算法导论版实现
本文主要实践一下算法导论上的快排算法,活动活动. 伪代码图来源于 http://www.cnblogs.com/dongkuo/p/4827281.html // imp the quicksort ...
- Javascript算法系列之快速排序(Quicksort)
原文出自: http://www.nczonline.net/blog/2012/11/27/computer-science-in-javascript-quicksort/ https://gis ...
- JavaScript 快速排序(Quicksort)
"快速排序"的思想很简单,整个排序过程只需要三步: (1)在数据集之中,选择一个元素作为"基准"(pivot). (2)所有小于"基准"的元 ...
- QuickSort 快速排序 基于伪代码实现
本文原创,转载请注明地址 http://www.cnblogs.com/baokang/p/4737492.html 伪代码 quicksort(A, lo, hi) if lo < hi p ...
- quicksort
快排.... void quicksort(int *a,int left,int right){ if(left >= right){ return ; } int i = left; int ...
- 随手编程---快速排序(QuickSort)-Java实现
背景 快速排序,是在上世纪60年代,由美国人东尼·霍尔提出的一种排序方法.这种排序方式,在当时已经是非常快的一种排序了.因此在命名上,才将之称为"快速排序".这个算法是二十世纪的七 ...
- JAVA Arrays.binarySearch
转自:http://blog.csdn.net/somebodydie/article/details/8229343 package com.jaky; import java.util.*; pu ...
随机推荐
- Hibernate - 使用注解完成映射
除了使用XML配置来映射对象和数据库表,还可以使用注解来完成持久化.使用注解需要导入Hibernate Annotations扩展包 @Entity -加在类的前面,将类声明为持久化类. -javax ...
- posix thread互斥量
互斥量 互斥量(Mutex)是“mutual exclusion”的缩写.互斥量是实现线程同步,和保护同时写共享数据的主要方法.使用互斥量的典型顺序如下:1. 创建和初始一个互斥量 2. 多个线程尝试 ...
- Python 基础【第六篇】字典
1.字典定义: 字典和列表类似 只是字典标示符用的是字符而列表用的是0开始的数字,字典中每个元素对应一个值 这个元素叫做键(key)键值不能重复 value(值)可以重复 2.字典格式: 格式一: [ ...
- Redis集群
一.Redis集群原理 集群技术是构建高性能网站架构的重要手段,试想在网站承受高并发访问压力的同时,还需要从海量数据中查询出满足条件的数据,并快速响应,我们必然想到的是将数据进行切片,把数据根据某种规 ...
- PHP之curl
当我第一次接触curl的时候,看文档,以及网上search各种资料,官方(http://cn2.php.net/manual/en/intro.curl.php)的解释是,这是某大牛写的一个libcu ...
- 【转】ArrayList的toArray,也就是list.toArray[new String[list.size()]];,即List转为数组
[转]ArrayList的toArray ArrayList提供了一个将List转为数组的一个非常方便的方法toArray.toArray有两个重载的方法: 1.list.toArray(); 2.l ...
- ASP.NET网络硬盘(文件上传,文件下载)
文件上传: 界面: 前台代码: <body style="text-align: center; background-image: url(Images/bg6.bmp);" ...
- ACM——01排序
http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1024 01排序 时间限制(普通/Jav ...
- 转载--- SQL Server XML基础学习之<4>--XPath
T-SQL 支持用于查询 XML 数据类型的 XQuery 语言. XQuery 基于现有的 XPath 查询语言,并支持更好的迭代.更好的排序结果以及构造必需的 XML 的功能. 所以我们本章先 ...
- SQL SERVER 与ACCESS、EXCEL的数据导入导出转换
* 说明:复制表(只复制结构,源表名:a 新表名:b) select * into b from a where 1<>1 * 说明:拷贝表(拷贝数据,源表名:a 目标表名:b) ...