二分查找

1、查找某元素。循环条件 low <= high,最终结果位mid, 如果查询失败则返回-1。

int binSearch(int num[], int low, int high, int x){
int mid;
while(low <= high){ //当搜索区间为空时结束
mid = low + (high - low) / ;
if(num[mid] == x)
return mid;
else if(num[mid] > x)
high = mid - ;
else low = mid + ;
}
return -;
}

2、查找第一个满足条件的元素。

     1)被排好序的待搜索序列一定是从左到右先不满足条件,然后满足条件; 

     2)传入的high = N时,在搜索不到满足条件的数时,会返回N(假想N位置有数字); 若不想传入N,则需要在函数刚进入就判断,最后一个元素是否不满足条件,若不满足则说明查找失败,返回-1。

     3)返回的是low而不是mid。

     4)最后一个小于x的元素,相当于查找第一个大于等于x的元素的前一个。

/*返回第一个大于等于x的元素。num[N]数组应从小到大排序。
如果传入的high = N,则当序列中所有元素都小于x时,会返回N */
int binSearch(int num[], int low, int high, int x){
int mid;
while(low < high){ //当low == high时结束搜索
mid = low + (high - low) / ;
if(num[mid] >= x)
high = mid; //mid有可能就是结果,所以区间上限不能漏掉mid
else low = mid + ;
}
return low; //返回low而不是mid
}

3、一般的套路是:固定一个端点(该端点顺序遍历),而对另一个端点采用二分法搜索。

4、使用二分法,搜索空间应该是有序的。

two points

1、使用2个指针,或者一头一尾,或两个都从头开始扫描。可以降低复杂度。主要关注指针移动的条件。

排序

1、归并排序

合并函数

void merge(int num[], int low1, int high1, int low2, int high2){
int temp[];
int index = , i = low1, j = low2;
while(i <= high1 && j <= high2){
if(num[i] < num[j])
temp[index++] = num[i++];
else
temp[index++] = num[j++];
}
while(i <= high1)
temp[index++] = num[i++];
while(j <= high2)
temp[index++] = num[j++];
for(int k = ; k < index; k++)
num[low1 + k] = temp[k];
}

排序, 非递归写法

void mergeSort(int num[], int len){
  for(int step = ; step <= len; step *= ){ //初始步长为2, 逐步变为4、8、16
for(int i = ; i < len; i += step){ //i + step为每个子区间的首部
int mid = i + step / - ;
merge(num, i, mid, mid + , min(i + step - , len - ));
}
}
}

递归写法

void mergeSort(int num[], int left, int right){
   if(left < right){
int mid = (left + right) / ;
mergeSort(num, left, mid);
mergeSort(num, mid + , right);
merge(A, left, mid, mid + , right);
}
}

2、插入排序:将a[0]至a[i]视作有序序列,将a[i + 1]插入a[0]至a[i]中,使之有序。

void inser(int num[], int len){for(int i = ; i < len; i++){
int temp = num[i];
int j = i - ;
while(j >= && temp < num[j]){
num[j + ] = num[j];
j--;
}
num[j + ] = temp;
}
}

3、对一个数列进行不同方法的排序时注意,对N个方法应使用N个拷贝数组,若对一个数组连续排序就会出错。

二分查找、two points、排序的更多相关文章

  1. 洛谷P4332 [SHOI2014]三叉神经树(LCT,树剖,二分查找,拓扑排序)

    洛谷题目传送门 你谷无题解于是来补一发 随便百度题解,发现了不少诸如树剖\(log^3\)LCT\(log^2\)的可怕描述...... 于是来想想怎么利用题目的性质,把复杂度降下来. 首先,每个点的 ...

  2. lintcode:Binary Search 二分查找

    题目: 二分查找 给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1. 样例 ...

  3. lintcode-457-经典二分查找问题

    457-经典二分查找问题 在一个排序数组中找一个数,返回该数出现的任意位置,如果不存在,返回-1 样例 给出数组 [1, 2, 2, 4, 5, 5]. 对于 target = 2, 返回 1 或者 ...

  4. 【二分搜索树】1、二分查找法的实现 - Binary Search

    简单记录 - bobo老师的玩转算法系列–玩转算法 - 二分搜索树 二叉搜索树 Binary Search Tree 查找问题 Searching Problem 查找问题是计算机中非常重要的基础问题 ...

  5. 第四篇、C_快速、冒泡、选择、插入排序、二分查找排序、归并、堆排序

    1.快速排序 实现: 1.取中间一个数作为支点 2.分别在支点的左右两边进行查找,如果左边查找到比支点大,右边查找到比支点小,就交换位置,如此循环,比支点小的数就排在了左边,比支点大的就排在右边 3. ...

  6. 九度OJ 1349 数字在排序数组中出现的次数 -- 二分查找

    题目地址:http://ac.jobdu.com/problem.php?pid=1349 题目描述: 统计一个数字在排序数组中出现的次数. 输入: 每个测试案例包括两行: 第一行有1个整数n,表示数 ...

  7. 《Algorithms Unlocked》读书笔记2——二分查找和排序算法

    <Algorithms Unlocked>是 <算法导论>的合著者之一 Thomas H. Cormen 写的一本算法基础,算是啃CLRS前的开胃菜和辅助教材.如果CLRS的厚 ...

  8. 《java入门第一季》之Arrays类前传(排序案例以二分查找注意的问题)

    根据排序算法,可以解决一些小案例.举例如下: /* * 把字符串中的字符进行排序. * 举例:"dacgebf" * 结果:"abcdefg" * * 分析: ...

  9. 常见的排序算法(直接插入&选择排序&二分查找排序)

    1.直接插入排序算法 源码: package com.DiYiZhang;/* 插入排序算法 * 如下进行的是插入,排序算法*/ public class InsertionSort {    pub ...

随机推荐

  1. Visual Studio2017 Remote Debugger

    前言 大家在使用vs打包后的文件部署到服务器后,有时候我们需要对线网的后台进行调试.但是它不像在VS中.这个时候我们该怎么调试呢? 微软想到了这一点,他们在 VS 中给我们提供了一个功能: Remot ...

  2. 一个很好用的在线编辑、展示、分享、交流JavaScript 代码的平台

    在发表博客时,有一些代码只能粘贴进去,而不能看到代码运行的效果,需要读者把代码粘贴进自己的编辑器,然后再运行看效果,这是一件很耗时的事情 在平时百度的时候,我发现一些网站可以在线预览功能,而且可以在线 ...

  3. SpringBoot笔记

    官网: http://springboot.fun/ 收集到一个比较全的: https://blog.csdn.net/xiaoyu411502/article/details/52474037 Id ...

  4. json模块 & pickle模块

    之前学习过用eval内置方法可以将一个字符串转成python对象,不过,eval方法是有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型的时候,eval就不管用了,所 ...

  5. 分布式监控系统Zabbix-3.0.3-新版微信报警(企业微信取代企业号)

    一般来说,Zabbix可以通过多种方式把告警信息发送到指定人,常用的有邮件,短信报警方式,但是现在越来越多的企业开始使用zabbix结合微信作为主要的告警方式,这样可以及时有效的把告警信息推送到接收人 ...

  6. use_frameworks!和#use_frameworks!的区别、解决Swift项目中use_frameworks!冲突的问题

    use_frameworks!和#use_frameworks!的区别 转自:https://www.jianshu.com/p/0ae58a477459 1. 用cocoapods 导入swift ...

  7. Linux内核分析——可执行程序的装载

    链接的过程 首先运行C预处理器cpp,将C的源程序(a.c)翻译成ASCII码的中间文件(a.i) 接着C编译器ccl,将a.i翻译成ASCII汇编语言文件a.s 接着运行汇编器as,将a.s翻译成可 ...

  8. 数组与字符串三(Cocos2d-x 3.x _Array容器)

    "程序=数据结构+算法" 在面向对象的语言中,诸如数组.堆栈.队列等的结构都被封装成了特定的类,按照特定数据结构的算法设计起来,这就是容器类. Cocos2d-x中,能使用的容器类 ...

  9. 广商博客冲刺第三天new

    第二天沖刺傳送門 第三四天沖刺傳送門 这一天我们主要是弄网页前台设计跟框架设计,这方面主要是由张奇聪负责.我们在amaze ui,smart ui,angularjs+bootstrap中挑选,最终选 ...

  10. 第三个Sprint冲刺第五天(燃尽图)