【译】算法的记录
线性搜索
为了搜索一个目标元素,从数组的左侧到右侧遍历。
伪代码示例#1:
Repeat, starting at the first element:
If the element is the target element, stop
Else, move to the next element
伪代码示例#2:
For i from 0 to n-1
If i'th element is target_element
Reture true
Reture false
JavaScript
语言示例:
linearSearch = (arr, target) => {
for(let i = 0; i < arr.length; i++) {
if(arr[i] === target) return true;
}
return false
}
复制代码
线性搜索算法
- 最坏的情况:
如果目标元素在数组的最后一个或不在数组中,需要遍历整个含有n
个元素的数组。
用大O表示法,这会被转换成O(n)。
- 最好的情况:
目标元素是第一个元素。
用大O表示法,这会被转换成Ω(1)。
二分查找
为了找到目标元素,每次可以通过减少搜索区域的一半来查找。二分查找算法是针对有序的数组进行,否则毫无意义。
伪代码示例#1:
Repeat until the (sub)array is of size 0:
Calculate the middle point of the current (sub)array
If the target element is the middle element, stop
Else if it's less than the middle:
End point is now just to the left of the current middle, repeat
Else if it's greater then the middle:
Start point is now just to the right of the current middle, repeat
伪代码示例#2:
If no items
Return false
If middle item is target_element
Return true
Else if target_element < middle item
Update end point
Search left half
Else if target_element > middle item
Update start point
Search right half
JavaScript
语言示例(递归):
binarySearch = (arr, target, start, end) => {
if(end >= start) {
let mid = Math.floor((start+end)/2);
if(arr[mid] === target) return mid;
else if(arr[mid] > target) return binarySearch(arr, target, start, mid-1);
else return binarySearch(arr, target, mid+1, end);
}
return false;
}
复制代码
二分查找算法:
- 最坏的情况:
需将n
个(排序好的)元素列表分为两部分,并重复此操作直到查到目标元素,因为元素有可能在最后一次拆分中,或者不在数组中。
用大O表示法,这会被转换成O(log n)。
- 最好的情况
目标元素刚好在元素的中间,所以我们刚开始就可以停止搜索。
用大O表示法,这会被转换成Ω(1)。
冒泡排序
冒泡排序:将大值移动到数组右边,将小值移到数组的左边。
伪代码示例#1:
Set swap counter to a non-zero value
Repeat until the swap counter is equal to 0:
Reset swap counter to 0
Look at each adjacent pair:
If two adjacent elements are not in order:
Swap them
Add one to the swap counter
伪代码示例#2:
Repeat until no swaps
For i from 0 to n-2
If i'th and i+1'th elements out of order
Swap them
JavaScript
语言示例:
bubbleSort = arr => {
for(let i = 0; i < arr.length-1; i++) {
for(let j = 0; j < arr.length-i-1; j++) {
if(arr[j] > arr[j+1]) {
let temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
return arr;
}
复制代码
因为是比较第i
和第i+1
个元素,所以在交换不符合排序的两个元素之前,只需要对i
进行n-2
的排序就即可。知道最大的n-1
个元素将向右冒泡,因此排序可以在n-1
个通过之后停止。
当重新遍历数组时,只要考虑没有排序的元素。当交换器保持为0
时,就没有其他要交换的内容了。
冒泡排序算法
- 最坏的情况:
一种情况是当数组已经是倒序排好,我们需要对每个数组元素进行冒泡。因为每遍只能将一个元素完全冒泡到其排序的位置,因此排序必须进行n
次。
用大O表示法,这会被转换成O(n²)。
- 最好的情况:
数组已经是完美排序好了,导致第一遍就没有元素交换。
用大O表示法,这会被转换成Ω(n)。
选择排序
找到最小的未排序的元素,然后将它放到排序好的列表末尾。
伪代码示例#1:
Repeat until there is no unsorted elements remaining:
Search unsorted part of data to find the smallest value
Swap the found value with the first element of the unsorted part
伪代码示例#2:
For i from 0 to n-1
Find smallest item between i'th item and last item
Swap smallest item with i'th item
JavaScript
语言示例:
selectionSort = arr => {
for(let i = 0; i < arr.length-1; i++) {
let min = i;
for(let j = i+1; j < arr.length; j++) {
if(arr[j] < arr[min]) {
min = j
}
}
let temp = arr[min];
arr[min] = arr[i];
arr[i] = temp;
}
return arr;
}
复制代码
选择排序算法
- 最坏的情况:
必须重复n
次排序过程才能迭代数组中的每一个,以找到未排序元素的最小元素,将其排序。每遍只排序一个元素。
用大O表示法,这会被转换成O(n²)。
- 最好的情况:
与最好的情况相同,因为在排序过程遍历数组的所有元素之前,无法保证对数组进行排序。
用大O表示法,这会被转换成Ω(n²)。
插入排序
在适当的位置建立一个排序的数组;在构建数组时,如有必要,将元素移开以腾出空间。
伪代码示例#1:
Call the first element of the array sorted
Repeat until all elment are sorted:
Insert next unsorted item into sorted part shifting the required number of items
伪代码示例#2:
For i from 1 to n-1
Insert next unsorted item into sorted part shifting i items
JavaScript
语言示例:
insertionSort = arr => {
for(let i = 1; i < arr.length; i++) {
let key = arr[i];
let j = i-1;
while(j >= 0 && arr[j] > key) {
arr[j+1] = arr[j];
j = j-1;
}
arr[j+1] = key;
}
return arr;
}
复制代码
插入排序算法
- 最坏的情况:
因为已经是反向有序的数组了,所以每次需要将n
个元素从n
个位置移开。
用大O表示法,这会被转换成O(n²)。
- 最好的情况:
数组已经排序。此时当我们遍历每个元素时,只在未排序和已排序元素之间移动。
用大O表示法,这会被转换成Ω(n)。
递归
优雅地编码!
- Gitlab利用Webhook实现Push代码后的jenkins自动构建
- db4o 7.4 for .net3.5试用手记
- JQuery笔记(五) 圆角表格的效果
- tomcat内存溢出问题记录
- 微信小程序开放 Wi-Fi、NFC 连接能力,未来可直接刷地铁?
- 2017奇葩机器人大盘点:Sophia想生孩子,Atlas后空翻,贝佐斯骑高达
- silverlight:分享一个不错的自定义布局CollectionFlow(可用于制作相册的哦!)
- 无法取得ConnectionSettings的问题
- DataTable,List去重复记录的方法
- Uploadify的一点总结
- 自动驾驶时代,中国移动要以怎样的姿势进入?
- JQuery中文日期控件
- Silverlight中的帧
- 窗口自动弹出浏览器显示广告的问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android自定义LinearLayout布局显示不完整的解决方法
- android短信管理器SmsManager实例详解
- Android开发判断一个app应用是否在运行的方法详解
- 收割腾讯等十几个Offer后,揭秘进大厂的秘诀和Android技术面试题汇总!
- Flutter BLoC 异步通信、BlocBuilder的基本使用、BlocProvider的初探
- Android设备获取扫码枪扫描的内容与可能遇到的问题解决
- 3分钟短文:胆儿真肥!Laravel在命令行问用户要数据!
- 实战矿马:数据异常牵出的挖矿木马(.systemd-service.sh)
- leetcode之两个相同字符之间的最长子字符串
- 面试阿里被P8质问:ConcurrentHashMap真的线程安全吗?
- 腾讯云TKE-搭建prometheus监控(二)
- Qt音视频开发41-人脸识别嵌入式
- 浅析Android Studio 3.0 升级各种坑(推荐)
- Android EasyPermissions官方库高效处理权限相关教程
- 关于Android 6.0权限的动态适配详解