JS中算法之排序算法
1、基本排序算法
1.1、冒泡排序
它是最慢的排序算法之一。
1、不断比较相邻的两个元素,如果前一个比后一个大,则交换位置。
2、当比较完第一轮的时候最后一个元素应该是最大的一个。
3、按照步骤一的方法进行相邻两个元素的比较,这个时候由于最后一个元素已经是最大的了,所以第二轮的时候最后一个元素不用比较,此后依次类推。
冒泡排序动图演示:

function bubbleSort(arr){
for(var i=0; i<arr.length-1; i++ ){
for(var j=0; j<arr.length-1-i ;j++ ){
if(arr[j] > arr[j+1]){
var temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
另一种写法可能更好理解:每一次比较后都拿最小的那个元素放到前面
for (let i = 0; i < ns.length - 1; i++) {
for (let j = i + 1; j < ns.length; j++) {
let temp;
if (ns[i] > ns[j]) {
temp = ns[i];
ns[i] = ns[j];
ns[j] = temp;
}
}
}
1.2、选择排序
从数组的开头开始,将第一个元素和其他元素进行比较,比较完所有元素后,将最小的元素与第一个元素交换,然后算法会从第二个元素继续,依次类推。当进行到数组的倒数第二个位置时,所有的数据便完成了排序。
选择排序动图演示:

function selectionSort(arr) {
var len = arr.length;
var minIndex, temp;
for (var i = 0; i < len - 1; i++) {
minIndex = i;
for (var j = i + 1; j < len; j++) {
if (arr[j] < arr[minIndex]) { //寻找最小的数
minIndex = j; //将最小数的索引保存
}
}
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
return arr;
}
1.3、插入排序
从第二个元素开始循环,当前面的元素比选中的元素大时将前面的元素向右移动,直至比较到第1个元素(即索引为0)或者前面的元素不再比选中的大,此时将选中的元素赋值给比它小的元素之后的位置。
插入排序动图演示:

function insertionSort(arr) {
var len = arr.length;
var preIndex, current;
for (var i = 1; i < len; i++) {
preIndex = i - 1;
current = arr[i]; //此时选中的元素
while(preIndex >= 0 && arr[preIndex] > current) {
arr[preIndex+1] = arr[preIndex]; //当比选中的元素大时元素向右移
preIndex--;
}
arr[preIndex+1] = current; //将选中的元素赋值给比它小的元素之后的位置
}
return arr;
}
以上的三种基本排序算法中,选择排序和插入排序要比冒泡排序快,插入排序是这三种算法中最快的
2、高级排序算法
高级排序算法被认为是处理大型数据集的最高效排序算法,它们处理的数据集可以达到上百万个元素。
2.1、希尔排序
这在插入排序的基础上做了很大的改善。它会首先比较距离较远的元素,而非相邻的元素。比较的元素之间的距离会不断减小,直至比较的是相邻元素,此时就是一个直接的插入排序。在开始做最后一次处理时,大部分元素都已经在正确的位置,算法就不必对很多元素进行交换,这就是希尔排序比插入排序更高效的地方。
比如:数组为 [49,38,65,97,26,13,27,49,55,4],当间隔为5时,将分组为五组数据(49,13)、(38,27)、(65,49)、(97,55)、(26,4),分别对五组数据进行直接的插入排序,然后此时的数组会变为 [13,27,49,55,4,49,38,65,97,26],依次类推直至间隔为1
通过定义一个间隔序列来表示在排序过程中进行比较的元素之间有多远的间隔。下面的算法时是动态定义间隔序列。
function shellSort(arr) {
var len = arr.length, current, gap = 1;
while (gap < len / 3) { //动态定义间隔序列
gap = gap * 3 + 1;
}
for (gap; gap > 0; gap = Math.floor(gap / 3)) { //间隔在不断改变,直至为 1
for (var i = gap; i < len; i++) { //从数组索引为间隔大小的位置开始
current= arr[i]; //相当于直接插入排序的选中元素
for (var j = i - gap; j >= 0 && arr[j] > temp; j -= gap) { //间隔序列所间隔开的元素进行直接插入排序
arr[j + gap] = arr[j];
}
arr[j + gap] = current; //将选中的元素赋值给比它小的元素之后的位置
}
}
return arr;
}
2.2、归并排序
归并排序的实现有两种方法:1、自上而下(自顶向下)的递归 。2、自下而上(自底向上)的迭代
将数据集分解为多组分别只有一个元素的数组,然后通过创建一组左右子数组将它们两两有序地合并起来,直到最后合并剩下的两个大的数组组成有序的完整数组。
归并排序动图演示:

function mergeSort(arr) {
var len = arr.length;
if (len < 2) {
return arr;
}
var middle = Math.floor(len / 2),
left = arr.slice(0, middle),
right = arr.slice(middle);
return merge(mergeSort(left), mergeSort(right));
}
function merge(left, right) {
var result = [];
while (left.length && right.length) {
if (left[0] <= right[0]) {
result.push(left.shift());
} else {
result.push(right.shift());
}
}
while (left.length)
result.push(left.shift());
while (right.length)
result.push(right.shift());
return result;
}
2.3、快速排序
是处理大数据最快的排序算法之一,快速排序算法非常适用于大型数据集合;在处理小数据集时性能反而会下降。
(1) 选择一个基准元素,将列表分隔成两个子序列,将所有小于基准值的元素放在基准值的前面,所有大于基准值的元素放在基准值的后面; (2) 分别对较小元素的子序列和较大元素的子序列重复步骤 1
快速排序动图演示:

function qSort(arr) {
if (arr.length == 0) {
return [];
}
var left = [];
var right = [];
var pivot = arr[0];
for (var i = 1; i < arr.length; i++) {
if (arr[i] < pivot) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return qSort(left).concat(pivot, qSort(right)); //小的元素都放在了基准值的左边,大的都放在了右边。小的和大的分别进行了递归,结果也是如此,所以完成了排序。
}
3、时间、空间复杂度

JS中算法之排序算法的更多相关文章
- 今天给大家分享一下js中常用的基础算法
今天给大家分享一下js中常用的基础算法,废话不多说,直接上代码: 1.两个数字调换顺序 ,b= function fun(a,b){ b = b - a ;// a = 2 ; b = 2 a = a ...
- 使用 js 实现十大排序算法: 堆排序
使用 js 实现十大排序算法: 堆排序 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法. 大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列: 小顶堆:每个 ...
- 在Object-C中学习数据结构与算法之排序算法
笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...
- js 常用的比较排序算法总结
每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 一直很惧怕算法,总是感觉特别伤脑子,因此至今为止,几种基本的排序算法一直都不是很清楚, ...
- Java基础语法(8)-数组中的常见排序算法
title: Java基础语法(8)-数组中的常见排序算法 blog: CSDN data: Java学习路线及视频 1.基本概念 排序: 是计算机程序设计中的一项重要操作,其功能是指一个数据元素集合 ...
- 使用 js 实现十大排序算法: 快速排序
使用 js 实现十大排序算法: 快速排序 QuickSort 快速排序 /** * * @author xgqfrms * @license MIT * @copyright xgqfrms * @c ...
- 使用 js 实现十大排序算法: 桶排序
使用 js 实现十大排序算法: 桶排序 桶排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!
- 使用 js 实现十大排序算法: 计数排序
使用 js 实现十大排序算法: 计数排序 计数排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!
- 使用 js 实现十大排序算法: 基数排序
使用 js 实现十大排序算法: 基数排序 基数排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!
随机推荐
- postman使用动态token发post请求小结
最近使用postman做接口测试,感觉挺好用的. 测试中,每次post请求都要携带一个token,token是通过get请求得来的,动态变化的,并且token有有效期的限制.为了避免重复获取token ...
- Linux运维知识之linux shell date 用当天时间做备份文件名
本文主要向大家介绍了Linux运维知识之linux shell date 用当天时间做备份文件名,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助. #!/bin/bash #dat ...
- hdu2182Frog(动态规划)
Problem Description A little frog named Fog is on his way home. The path's length is N (1 <= N &l ...
- 配置NAT实验
实验拓扑: 下面先配置静态NAT:(将私网地址转为公网地址)内部地址到外部地址的1对1转换 1.先配置出口静态路由,指向公网入口路由器 2.nat static命令配置1对1的IP地址转换 3.测试: ...
- C++学习笔记(二)--基础
1.浮点型数值不管写成什么样 都是以指数形式保存在内存中 数符|数字部分|指数部分 例:+0.33E10 数字部分的整数部分不能大于1,小数点后面不能是0. 2.字符数据是以整数形式保存在内存中的(A ...
- (Vue)移动端点击输入框,弹出键盘,底部被顶起问题
(Vue)移动端点击输入框,弹出键盘,底部被顶起问题:https://www.jianshu.com/p/210fbc846544 问题描述:Vue开发中,当我们相对于父视图的底部布局子控件时,需要用 ...
- let/const及块级作用域
本系列是在平时阅读.学习.实际项目中有关于es6中的新特性.用发的简单总结,目的是记录以备日后温习:本系列预计包含let/const.箭头函数.解构.常用新增方法.Symbol.Set&Map ...
- stringstream流分割空格
1205 单词翻转 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题目描述 Description 给出一个英语句子,希望你把句子里的单词顺序都翻转 ...
- C#设计模式:适配器模式(Adapter Pattern)
一,Adapter适配器模式是将两个不兼容的类组合在一起使用,如下例子 using System; using System.Collections.Generic; using System.Lin ...
- React入门-JSX和虚拟dom
1.JSX理解 举例: const element = <h1>Hello, world!</h1>; 这被称为 JSX,是一个 JavaScript 的语法扩展.建议在 Re ...