JS的排序算法
排序是最基本的算法(本文排序为升序Ascending),常见的有以下几种:
1、冒泡排序 Bubble Sort
2、选择排序 Selection Sort
3、插入排序 Insertion Sort
4、快速排序 Quick Sort
5、归并排序 Merge Sort
冒泡排序 Bubble Sort
冒泡排序是最慢的排序算法,同时也是最直观、最容易想到的排序方法。
步骤
1、比较第一个和第二个元素,若第一个元素大于第二个元素,则交换位置。
2、若第一个小于第二个元素,则继续比较第二个和第三个元素,重复步骤1。
3、经过第一轮比较,则至少最大的元素已经被移动到数组最后一个位置,就像“气泡冒出了水面”一样。
4、继续重复步骤1和步骤2
5、排序成功。
代码
function bubbleSort(arr){
var temp, swapped;
do {
// 若本轮循环中,已经没有任何元素交换位置,则说明排序已经完成,退出循环
swapped = false;
for(var i =0;i<arr.length;i++){
if(arr[i] > arr[i+1]) {
// 若arr[i] > arr[i+1],则交换arr[i]和arr[i+1]
temp = arr[i+1];
arr[i+1] = arr[i];
arr[i] = temp;
swapped = true;
}
}
} while (swapped)
return arr;
}
时间复杂度
O(n2)
选择排序 Selection Sort
在未排序中选择最小的,放在数组第一个位置。然后从剩余未排序数组中,选择最小的,放在第二个位置。遍历重复,最终完成排序。
和冒泡排序一样,时间复杂度太大,实际中不会用到。
步骤
1. 假设第一个元素是最小的,最小的位置记为minIndex=0。依次和后面的元素比较,若第i个元素更小,则更新minIndex=i,一直到数组最后一个元素。
2. 第一遍遍历之后,若minIndex与开始假设最小的位置不同,则交换元素。
3. 重复步骤1和步骤2,直到排序完成。
代码
function selectSort(arr) {
var length = arr.length,
swap,
min;
for (var i = 0; i < length; i++) {
// 假设第i个是最小的,min=i
min = i;
for (var j = i + 1; j < length; j++) {
// 如果第j个更小,则min=j
if (arr[min] > arr[j]) {
min = j;
}
}
// 如果假设的最小的和实际中最小的,不是同一个位置的,则交换位置
if (min != i) {
swap = arr[min];
arr[min] = arr[i];
arr[i] = swap;
}
}
return arr;
}
时间复杂度
O(n2)
插入排序 Insertion Sort
假设数组分为左右两个部分:左侧是已排序(Sorted)的,右侧是未排序(Unsorted)的。从右侧未排序中,依次取出一个元素,倒序和排序好的元素对比,放在不大于已排序的位置。
步骤
1. 取出第一个元素,可以认为是已排序的。
2. 取出下一个元素,在已排序中从后向前扫描。
3. 若该元素(已排序)大于新元素,则该元素向后移一位。
4. 重复步骤3,直到直到找到已排序的元素小于或者等于新元素的位置
5. 将新元素插入到该位置后
6. 重复步骤1到步骤5.
代码
function insertionSort(arr) {
var length = arr.length,
temp, j;
for (var i = 0; i < length; i++) {
// 取得第i个元素,标记为temp
temp = arr[i];
j = i - 1;
// 依次和前面的元素比较,若前面的元素大于temp,则元素向后移动一位,直到不满足条件
while (j >= 0 && arr[j] > temp) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = temp;
}
return arr;
}
快速排序 Quick Sort
快速排序是一种有效率的排序方式。
步骤
1. 选择一个基准元素,通常选择中间的元素。
2. 遍历数组,将比基准元素小的元素放到左边,比基准元素大的元素放到右边。
3. 重复步骤1和步骤2。
代码
function quickSort(arr) {
// 空数组或是一个元素的数组,直接返回数组
if (arr.length <= 1) return arr;
// 取出基准元素
var pivot = arr.splice(Math.floor(arr.length / 2), 1)[0],
left = [],
right = [];
for (var i = 0, length = arr.length; i < length; i++) {
// 和基准元素比较大小,分别放在left和right数组中
if (arr[i] <= pivot) {
left.push(arr[i])
} else {
right.push(arr[i])
}
}
// 递归操作
return quickSort(left).concat(pivot, quickSort(right))
}
时间复杂度
平均时间复杂度:O(NlogN)
归并排序 Merge Sort
是一种分治(divide and conquer )的算法。
将数组拆分(divide)为小的数组,对小的数组继续拆分,重复操作直至每个数组的元素只有一个。然后比较大小,进行合并。
步骤
1、递归分割数组,直至最小的数组只有一个元素。
2、两个相邻的最小数组单元比较大小,完成排序。
3、两个次一级的最小数组单元比较大小,完成排序。
4、重复操作,完成排序。
代码
// eg: mergeSort([1, 3, 8, 3, 5, 3, 5, 22])
// divide function:递归将函数切分为只有一个元素的数组
function mergeSort(arr) {
if (arr.length < 2) return arr;
var mid = Math.floor(arr.length / 2),
left = arr.slice(0, mid),
right = arr.slice(mid);
return merge(mergeSort(left), mergeSort(right));
}
// conquer function 合并,将分割开的数组合并起来
function merge(left, right) {
var lLength = left.length,
rLength = right.length,
lIndex = 0,
rIndex = 0,
result = [];
// left和right都是已经排序好的
// 依次比较每个元素大小,将小的元素push进result,直至left或是right中的任意一个元素都已经被push进result
while (lIndex < lLength && rIndex < rLength) {
if (left[lIndex] <= right[rIndex]) {
result.push(left[lIndex++])
} else {
result.push(right[rIndex++])
}
}
// 这两种是一样的,因为此时left.slice(lIndex)和right.slice(rIndex)必定有一个是空元素
// return result.concat(left.slice(lIndex)).concat(right.slice(rIndex))
return result.concat(left.slice(lIndex)).concat(right.slice(rIndex))
}
时间复杂度
[参考资料]
JS用到的排序:http://khan4019.github.io/front-end-Interview-Questions/sort.html
JS用到的排序:https://juejin.im/post/57dcd394a22b9d00610c5ec8
可视化的JS排序网站:http://jsdo.it/norahiko/oxIy/fullscreen
冒泡排序:http://www.stoimen.com/blog/2010/07/09/friday-algorithms-javascript-bubble-sort/
选择排序:https://www.nczonline.net/blog/2009/09/08/computer-science-in-javascript-selection-sort/
插入排序:http://codingmiles.com/sorting-algorithms-insertion-sort-using-javascript/
快速排序:http://www.ruanyifeng.com/blog/2011/04/quicksort_in_javascript.html
JS的排序算法的更多相关文章
- JS常见排序算法
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- js 实现排序算法 -- 快速排序(Quick Sort)
原文: 十大经典排序算法(动图演示) 快速排序 快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整 ...
- js 实现排序算法 -- 归并排序(Merge Sort)
原文: 十大经典排序算法(动图演示) 归并排序 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得 ...
- js 实现排序算法 -- 插入排序(Insertion Sort)
原文: 十大经典排序算法(动图演示) 插入排序 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描, ...
- js 实现排序算法 -- 希尔排序(Shell Sort)
原文: 十大经典排序算法(动图演示) 希尔排序 1959年Shell发明,第一个突破O(n2)的排序算法,是简单插入排序的改进版.它与插入排序的不同之处在于,它会优先比较距离较远的元素.希尔排序又叫缩 ...
- js 实现排序算法 -- 冒泡排序(Bubble Sort)
原文: 十大经典排序算法(动图演示) 冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来.走访数列的工作 ...
- js 实现排序算法 -- 选择排序(Selection Sort)
原文: 十大经典排序算法(动图演示) 选择排序(Selection Sort) 选择排序(Selection-sort)是一种简单直观的排序算法.它的工作原理:首先在未排序序列中找到最小(大)元素,存 ...
- JS 随机排序算法
https://www.cnblogs.com/getdaydayup/p/6592154.html 使用JS编写一个方法 让数组中的元素每次刷新随机排列 法一: var arr =[1,2,3,4] ...
- js分组排序算法, OrderBy
由于项目中需要对数据进行分组排序,类似于sql中 order by column1,column2.... 实现的关键是 分组排序,第一个column1,排序完成之后,对其分组,然后按照column ...
随机推荐
- Flask基本知识
@app.route('/')def hello_world(): return 'Hello World!' #route动态Route,支持字符串.整数.浮点数,/user/<int:id& ...
- OpenERP how to set the tree view limit
return { 'name':u'库存报表', 'view_type':'form', 'view_mode':'tree,form', 'res_model':'rainsoft.account. ...
- C#方法重载和方法重写的区别
一.重载的条件: 1.必须在同一个类中: 2.方法名必须相同: 3.参数列表不能相同. 二.重写的条件: 1. 在不同的类中2. 发生方法重写的两个方法返回值,方法名,参数列表必须完全一致(必须具有相 ...
- Linux网络编程服务器模型选择之并发服务器(上)
与循环服务器的串行处理不同,并发服务器对服务请求并发处理.循环服务器只能够一个一个的处理客户端的请求,显然效率很低.并发服务器通过建立多个子进程来实现对请求的并发处理.并发服务器的一个难点是如何确定子 ...
- 第2章—装配Bean—自动化装配Bean
自动化装配Bean 2.1.Spring配置可选方案 装配是依赖注入DI的本质,Spring提供了以下三种注入的装配机制: 在XMl中进行显式配置 在java中进行显式配置 隐式的Bean发现机制 ...
- 第1章—Spring之旅—容纳你的Bean
容纳你的Bean 在基于Spring的应用中,你的应用对象生存于Spring容器中.Spring负责创建对象,装配他们,配置他们并管理他们整个生命周期,从生存到死亡(在这里 可能是new 到 fina ...
- PHP 中 strlen 获取中英 字符长度 以作以后对比使用
ANSII编码: 1 长度是3 a 长度是3 ? 长度是3 我 长度是4 ?长度是2 ---------------------------- UTF-8编码: 1 长度是1 a长度是1 ? 长度是1 ...
- 最新 IntelliJ Idea 2017 激活方法(转)
转载地址:http://www.cnblogs.com/suiyueqiannian/p/6754091.html 1. 到网站 http://idea.lanyus.com/ 获取注册码. 2.填入 ...
- android的计算器
今天我闲着无聊,便想仿照Iphone的计算器自己写一个出来玩玩,于是就开动脑经,来场头脑风暴了!我拿什么了写呢?wp?这是个不错的选择,但是我最近在研究安卓的开发(求各位MSP不要烧我,我买不起MAC ...
- IE浏览器上传文件后返回结果会自动弹出下载框
服务器使用的是node,其它语言的后台没测试过. 在IE低版本浏览器下,当你上传一个文件后后台会返回一些数据,但是IE浏览器会弹出下载提示. 这个问题是之前处理的了,没有细究,今天有人问到这个问题,顺 ...