描述
数轴上有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的更多相关文章

  1. 折半查找,binarySearch

    折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务.它的基本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比 ...

  2. 现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法

    欢迎大家加入我的社区:http://t.csdn.cn/Q52km 社区中不定时发红包 文章目录 1.UML类图 2.源码: 3.优缺点分析 1.UML类图 2.源码: package com.bac ...

  3. quickSort算法导论版实现

    本文主要实践一下算法导论上的快排算法,活动活动. 伪代码图来源于 http://www.cnblogs.com/dongkuo/p/4827281.html // imp the quicksort ...

  4. Javascript算法系列之快速排序(Quicksort)

    原文出自: http://www.nczonline.net/blog/2012/11/27/computer-science-in-javascript-quicksort/ https://gis ...

  5. JavaScript 快速排序(Quicksort)

    "快速排序"的思想很简单,整个排序过程只需要三步: (1)在数据集之中,选择一个元素作为"基准"(pivot). (2)所有小于"基准"的元 ...

  6. QuickSort 快速排序 基于伪代码实现

    本文原创,转载请注明地址 http://www.cnblogs.com/baokang/p/4737492.html 伪代码 quicksort(A, lo, hi) if lo < hi p ...

  7. quicksort

    快排.... void quicksort(int *a,int left,int right){ if(left >= right){ return ; } int i = left; int ...

  8. 随手编程---快速排序(QuickSort)-Java实现

    背景 快速排序,是在上世纪60年代,由美国人东尼·霍尔提出的一种排序方法.这种排序方式,在当时已经是非常快的一种排序了.因此在命名上,才将之称为"快速排序".这个算法是二十世纪的七 ...

  9. JAVA Arrays.binarySearch

    转自:http://blog.csdn.net/somebodydie/article/details/8229343 package com.jaky; import java.util.*; pu ...

随机推荐

  1. iOS越狱程序开发

    iOS越狱程序开发http://www.docin.com/p-760246852.html

  2. mysql修改主键

    先删除所有主键 alter table tableName drop primary key; 然后添加主键 alter table tableName primary key(id);//如果是联合 ...

  3. (转)(contant的一些用法)

    主要就是增加约束的 以下几种约束 .并 一一列举: 1.主键约束:要对一个列加主键约束的话,这列就必须要满足的条件就是分空因为主键约束:就是对一个列进行了约束,约束为(非空.不重复)以下是代码  要对 ...

  4. ORM中去除反射,添加Expression

    之前接触了别人的ORM框架,感觉牛掰到不行,然后试着自己来写自己的ORM. 最初从园子里找到其他人写的反射的例子: List<PropertyInfo> pis = typeof(T).G ...

  5. Android 获取天气预报

    界面布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android ...

  6. C#之装箱和拆箱

    在实际编码过程中,有时候会出现装箱和拆箱操作.下面就类分别认识一下: 需要注意的是,类型转换和这个是不同的.Convert方法并没有发生装箱和拆箱操作,而是类型转换,包括int.parse等等. 装箱 ...

  7. MBR与分区表备份与恢复

    常用工具列表 dd                   数据复制,转换实用工具 tar                  GNU磁盘存档实用工具 cpio                数据存档实用工 ...

  8. ###Linux基础 - 1

    点击查看Evernote原文. #@author: gr #@date: 2014-10-11 #@email: forgerui@gmail.com 前言 为什么学习Linux?:-) 酷Cool ...

  9. oc 通过webView调用js方法

    - (void)viewDidLoad { [super viewDidLoad]; //加载本地web页面 web = [[UIWebView alloc]init]; web.background ...

  10. UIButton 未响应原因分析

    1.父视图响应者链被阻断;例如:在 UILabel,UIImageView 控件添加UIButton,因为UILabel(userInteractionEnabled属性值为NO) 阻断了响应者链,所 ...