电脑配置

CPU:AMD X4 640

内存: 宏想 DDR3 1600MHz 8g

主板:华擎 980DE3/U3S3 R2.0

浏览器:chrome 79.0.3945.88(正式版本) (64 位)

时间测试函数

        function testRunTime(fn) {
let start = new Date();
let end = null;
fn();
end = new Date();
console.log(`运行时间: ${(end - start) / 1000}秒`);
}

1.冒泡排序

2.选择排序

3.插入排序

4.希尔排序

5.归并排序

6.快速排序

7.计数排序

8.堆排序

9.二分法排序 每插入一个新元素,就对其进行排序

冒泡排序

排序思想:判断两个相邻元素,大于则交换位置

复杂度:O(n^2)

例子:[2 4 5 3 1] > [2 4 3 1 5] > [2 3 1 4 5] > 2 1 3 4 5] > [1 2 3 4 5]

// 冒泡排序
function bubbleSort(arr) {
let len = arr.length-1;
for (let i=0; i<len; i++) {
for (let j=0; j<len-i; j++) {
if (arr[j] > arr[j+1]) { // 大于则交换两个的位置
let temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
return arr;
}

2.选择排序

排序思想: 每次判断,拿到最小值,交换位置

复杂度:O(n^2)

例子:[2 4 5 3 1] > [1 3 5 3 2] > [1 2 5 3 4] > [1 2 3 5 4] > [1 2 3 4 5]

// 选择排序
function selectionSort(arr) {
let len = arr.length;
let minIndex, temp;
for (let i=0; i<len; i++) {
minIndex = i;
for (let j=i+1; j<len; j++) {
if (arr[minIndex] > arr[j]) {
minIndex = j; // 保存最小值索引
}
}
// 进行互换位置
temp = arr[minIndex];
arr[minIndex] = arr[i];
arr[i] = temp;
}
return arr;
}

3. 插入排序

适用与规模小、有序的数据3w-

排序思想:将数组分成两个,一个是已排序好的,一个是待排序的,将待排序的元素和已排序好的元素进行比较,插入适当位置。

复杂度:O(n^2) 有序程度越高,越快

例子:[2] [4 5 3 1] > [2 4] [5 3 1] > [2 4 5] [3 1] > [2 3 4 5] [1] > [1 2 3 4 5]

// 插入排序
function insertionSort(arr) {
let len = arr.length;
let prev, cur; for (let i = 1; i < len; i++) {
prev = i - 1;
cur = arr[i];
while (prev>=0 && arr[prev]>cur) {
arr[prev+1] = arr[prev];
prev--;
}
arr[prev+1] = cur;
}
return arr;
}

4. 希尔排序

适用于中等规模的数据10万+

排序思想:将数组拆分成不同的间隔,对每个间隔进行插入排序,最后将全部进行一次插入排序

复杂度:O(n^1.5) 有序程度越高,越快

            let len = arr.length;
let h = Math.floor(len/2);
// while (h < len / 3) { h = 3 * h + 1 };
while (h >= 1) {
for (let i = h; i < len; i++) {
for (let j = i; j >= h && arr[j] < arr[j - h]; j -= h) {
let t = arr[j];
arr[j] = arr[j - h];
arr[j - h] = t;
}
}
h = Math.round(h / 3);
}
return arr;

5. 归并排序

排序思想:将数组拆分成最小单元,进行比较插入

复杂度:O(nlogn)

例子:[ 2 4 5 3 1] > [2] [4] [5] [3] [1] > [2 4] [5] [3] [1] > [2 4 5] [3] [1] > [2 3 4 5] [1] > [1 2 3 4 5]。从左往右比较合并

// 归并排序
function mergeSort(arr) {
if (arr.length < 2) {
return arr;
}
let middle = Math.floor(arr.length/2);
let left = arr.slice(0, middle);
let right = arr.slice(middle); return merge(mergeSort(left), mergeSort(right));
} function merge(left, right) {
let 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;
}

6.快速排序

排序思想:取一个基准值,比基准值小的在左边,大的在右边;左右在继续这样的操作,最后合并。

复杂度:O(nlogn)

例子:[ 2 4 3 5 1 ] > [ 2 1]+[ 3 ]+[ 4 5 ] > [ 1 ]+[ 2 ]+[ 3 ]+[ 4 ]+[ 5 ]

// 快速排序
function quickSort (arr) {
if (arr.length < 2) { // 数组元素只有一个的时候
return arr;
}
let pivotIndex = Math.floor(arr.length/2);
let pivot = arr.splice(pivotIndex,1)[0]; // 基准值
let left = [], // 存放比基准值小的
right = []; // 存放比基准值大的
arr.forEach(item=>{
if (item <= pivot) {
left.push(item);
} else {
right.push(item);
}
})
return quickSort(left).concat([pivot], quickSort(right));
}

7. 计数排序

排序思想:将数组的值当另一个数组的索引,再取出来。典型的空间换时间。

复杂度:O(n+m) m为元素最大值

例子

function countingSort(arr) {
let bucket = [],
sortedIndex = 0;
arrLen = arr.length; for (let i = 0; i < arrLen; i++) { // 拿到数组的值当索引
if (!bucket[arr[i]]) {
bucket[arr[i]] = 0;
}
bucket[arr[i]]++;
} for (let i = 0,len=bucket.length; i < len; i++) {
while(bucket[i] > 0) { // 拿到索引填充到数组中
arr[sortedIndex] = i;
sortedIndex++;
bucket[i]--;
}
} return arr;
}

8.堆排序

排序思想:先构建一个最大堆,然后循环数组,依次将最大的元素放到末尾

复杂度:O(nlogn)

            function heapSort(arr) {
let len = arr.length;
function maxHeapify(i) {
let left = 2 * i + 1;
let right = 2 * i + 2;
let largest = i; if (left < len && arr[left] > arr[largest]) {
largest = left;
}
if (right < len && arr[right] > arr[largest]) {
largest = right;
}
if (largest != i) {
swap(i, largest);
maxHeapify(largest);
}
}
function swap(i, j) {
let t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
// 构建堆
for (let i = Math.floor(len/2) - 1; i >= 0; i--) {
maxHeapify(i);
}
// 大-> 小
for (let i = arr.length - 1; i > 0; i--) {
swap(0, i);
len--;
maxHeapify(0);
}
/* 小->大
for (let i = 0; i < len; i++) {
maxHeapify(i);
}
*/
return arr;
}

9.二分法排序

排序思想:插入元素时进行排序,因为之前的元素是有序的,所以可以使用二分法,到最后,小于中间值的插入中间值前面,大于或等于中间值的插入后面

复杂度:nlog2^n

        function binarySort(arr, val) {
let begin = 0;
let end = arr.length - 1;
let middle = Math.floor(end / 2);
while (begin < end && arr[middle] != val) { // 二分排序法
if (arr[middle] > val) {
end = middle - 1;
} else if (arr[middle] < val) {
begin = middle + 1;
}
middle = Math.floor(begin + (end - begin) / 2);
}
if (arr[middle] > val) { // 最后找到的中间值,只有两种结果
arr.splice(middle, 0, val);
} else {
arr.splice(middle + 1, 0, val);
}
return arr;
}
testRunTime(() => {
let arr = [];
for (let i = 0; i < 100000; i++) {
let num = Math.floor(Math.random() * 10000);
arr = binarySort(arr,num);
};
});

js实现常见排序算法的更多相关文章

  1. JS中常见排序算法详解

    本文将详细介绍在JavaScript中算法的用法,配合动图生动形象的让你以最快的方法学习算法的原理以及在需求场景中的用途. 有句话怎么说来着: 雷锋推倒雷峰塔,Java implements Java ...

  2. 常见排序算法(JS版)

    常见排序算法(JS版)包括: 内置排序,冒泡排序,选择排序,插入排序,希尔排序,快速排序(递归 & 堆栈),归并排序,堆排序,以及分析每种排序算法的执行时间. index.html <! ...

  3. JS常见排序算法

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. 常见排序算法原理及JS代码实现

    目录 数组 sort() 方法 冒泡排序 选择排序 插入排序 希尔排序 归并排序 堆排序 快速排序 创建时间:2020-08-07 本文只是将作者学习的过程以及算法理解进行简单的分享,提供多一个角度的 ...

  5. JavaScript版几种常见排序算法

    今天发现一篇文章讲“JavaScript版几种常见排序算法”,看着不错,推荐一下原文:http://www.w3cfuns.com/blog-5456021-5404137.html 算法描述: * ...

  6. 常见排序算法(附java代码)

    常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...

  7. 常见排序算法-Python实现

    常见排序算法-Python实现 python 排序 算法 1.二分法     python    32行 right = length-  :  ]   ):  test_list = [,,,,,, ...

  8. JS十种经典排序算法,纯动画演示,学会了怼死面试官!

    十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间非比较类排序:不通过比较来决定 ...

  9. python常见排序算法解析

    python——常见排序算法解析   算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法 ...

随机推荐

  1. python让你再也不为文章配图与素材发愁,让高清图片占满你的硬盘! #华为云·寻找黑马程序员#

    欢迎添加华为云小助手微信(微信号:HWCloud002 或 HWCloud003),输入关键字"加群",加入华为云线上技术讨论群:输入关键字"最新活动",获取华 ...

  2. 漫谈边缘计算(三):5G的好拍档

    边缘计算的热度迅速攀升,还有一个不得不提的因素,就是5G的发展. [5G推动云计算从集中化向分布式演进] 在第一篇文章(<漫谈边缘计算(一):边缘计算是大势所趋>)中我提到,传统的云计算技 ...

  3. 基于webpack实现多html页面开发框架二 css打包、支持scss、文件分离

    本节主要介绍webpack打包的时候CSS的处理方式 一.解决什么问题      1.CSS打包      2.CSS处理浏览器兼容      3.SASS支持      4.CSS分离成单独的文件 ...

  4. Maven学习整理

    1. window系统中安装Maven 2. 解决使用代理联网时无法下载jar包 3. 配置本地仓库 4. 处理本地仓库和中央仓库都没有依赖的jar包的情况

  5. 使用SSH服务远程管理主机(使用密钥)

    使用ssh服务远程管理主机 SSH是建立在应用层和传输层基础上的安全协议,目的是要在非安全网络上提供安全的远程登录和其他安全网络服务. 通过SSH连接可以远程管理Linux等设备,默认linuxssh ...

  6. 使用SQL计算宝宝每次吃奶的时间间隔

    需求:媳妇儿最近担心宝宝的吃奶时间不够规律,网上说是正常平均3小时喂奶一次,让我记录下每次的吃奶时间,分析下实际是否偏差很大,好在下次去医院复查时反馈给医生. 此外,还要注意有时候哭闹要吃奶,而实际只 ...

  7. leetcode字节跳动专题(持续更新)

    挑战字符串 无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最 ...

  8. CF595 Div31249A,1249B1,1249B2,1249C1,1249C2,1249D1,1249D2,1249E,1249F)题解

    A:水题,先排序,有相连的输出2,否则输出1. #include<bits/stdc++.h> using namespace std; #define pii pair<int,i ...

  9. 强化学习环境OpenAi搭建,从虚拟机到Gym、Mujoco和mujoco-py的完整安装

    平时不怎么写博客,这次是因为环境的配置花费了我大概一个星期的时间.所以简单的记录一下搭建的整个过程,其中有些部分我直接推荐别人的博客的基本教程,都是我亲自尝试过成功的.同时,也希望这篇博客可以帮到您. ...

  10. C#实现在foreach遍历中删除集合中的元素(方法总结)

    目录 方法一:采用for循环,并且从尾到头遍历 方法二:使用递归 方法三:通过泛型类实现IEnumerator 在foreach中删除元素时,每一次删除都会导致集合的大小和元素索引值发生变化,从而导致 ...