二分查找

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. 一文让你完全弄懂Stegosaurus

    国内关于 Stegosaurus 的介绍少之又少,一般只是单纯的工具使用的讲解之类的,并且本人在学习过程中也是遇到了很多的问题,基于此种情况下写下此文,也是为我逝去的青春时光留个念想吧~ Stegos ...

  2. 第三个Sprint ------第二天

    主界面代码 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns: ...

  3. 【SE】Week3 : 四则运算式生成评分工具Extension&Release Version(附加题)

    [附加题]第四阶段目标 - 界面模块,测试模块和核心模块的松耦合. 写到这里我只想吐槽一句,哪天我能写出功能复杂且真正松耦合的模块,我应该就不用写代码了吧[手动再见.. 当然这只是强调下松耦合和代码复 ...

  4. Mysql 5.7.21 设置主从库同步

    主从复制条件: Mysql 单机多实例安装参考Mysql 5.7.21 设置主从库同步 下面的操作是多实例主从复制,3306为主库,3307为从库. 主库要开启log-bin,主库和从库的server ...

  5. Linux 下如何知道是否有人在使坏?

    在 Linux 下查看用户的行为,不仅仅是网管要做的事,也是开发人员所应该具备的基本技能之一.为什么呢?因为有时其他同事在做一些很消耗资源的事情,比如在编译大型程序,可能会导致服务器变得很慢,从而影响 ...

  6. CentOS7 卸载mariadb 安装mysql的过程:

    1. 检查安装的mariadb rpm -qa |grep mariadb 得到已经安装的安装包 mariadb-libs-5.5.56-2.el7.x86_64mariadb-devel-5.5.5 ...

  7. [转帖] securebootthemes 挖矿病毒的说明 http://blog.netlab.360.com/msraminer-qian-fu-yi-jiu-de-wa-kuang-jiang-shi-wang-luo/ 原文为毛不给一个专杀工具呢.

    MsraMiner: 潜伏已久的挖矿僵尸网络 2017 年 11 月底,我们的 DNSMon 系统监测到几个疑似 DGA 产生的恶意域名活动有异常.经过我们深入分析,确认这背后是一个从 2017 年 ...

  8. Qt__事件处理机制

    一.Qt事件 Qt会将系统消息(如鼠标按键.键盘按键等)转化为Qt事件,Qt事件被封装为对象且定义该对象的类均继承自抽象类QEvent. 二.Qt事件的产生 1.操作系统产生 Spontaneous ...

  9. angular2+中数据变更子组件页面未更新

    引入监测 import {ChangeDetectorRef} from '@angular/core'; constructor( private changeDetectorRef:ChangeD ...

  10. Kivy crash 中文教程 实例入门 1. 第1个应用 Kivy App (Making a simple App)

    1.  空白窗口 在 PyCharm 中创建一个名为 TutorialApp 的项目,然后在该项目中新建了个名为 tutorial_app.py 的 Python 源文件,在 PyCharm 的代码编 ...