1.快速排序
class QuickSort {
Sort(originalArray) {
// 复制 originalArray 数组防止它被修改
const array = [...originalArray]; // 如果 originalArray 数组元素个数 <=1,就不需要排序了,直接返回
if (array.length <= 1) {
return array;
} // 初始化左数组和右数组
const leftArray = [];
const rightArray = []; // 取出 originalArray 数组中的第一个元素作为中间比较值
const pivotElement = array.shift();
const centerArray = [pivotElement]; // 把 originalArray 数组拆分成左、中、右三个数组
while (array.length) {
const currentElement = array.shift(); if (currentElement == pivotElement) {
centerArray.push(currentElement);
} else if (currentElement < pivotElement) {
leftArray.push(currentElement);
} else {
rightArray.push(currentElement);
}
} // 递归对左、右数组进行排序
const leftArraySorted = this.Sort(leftArray);
const rightArraySorted = this.Sort(rightArray); // 最后把排好序的左、中、右数组拼接起来,并返回
return leftArraySorted.concat(centerArray, rightArraySorted);
}
}

2.选择排序
class SelectionSort{
Sort(originalArray){
// 复制 originalArray 防止它被修改
const array = [...originalArray]; for(let i = 0; i<array.length - 1; i += 1){
let minIndex = i; // 查找剩余数组中的最小元素
for(let j = i+1; j<array.length; j += 1){
if(array[j] < array[minIndex]){
minIndex = j;
}
} // 如果找到新的最小元素,就把它和当前元素进行交换
if(minIndex !== i){
const tmp = array[i];
array[i] = array[minIndex];
array[minIndex] = tmp;
}
} return array;
}
}

3.冒泡排序
class BubbleSort {
// 常见的写法
Sort1(originalArray) {
const array = [...originalArray];
for (let i = 1; i < array.length; i += 1) {
let swapped = false;
for (let j = 0; j < array.length - i; j += 1) {
if (array[j] > array[j + 1]) {
const tmp = array[j];
array[j] = array[j + 1];
array[j + 1] = tmp; swapped = true; // 记录是否交换过元素
}
}
if (!swapped) { // 如果未发生过交换(swapped = false),则表明已经排好序,结束循环
return array;
}
}
} // 常见的写法(循环语句换成:do..while 方式)
Sort2(originalArray) {
const array = [...originalArray]; // 在原始数组的副本上修改
let n = array.length;
let swapped = false;
do {
swapped = false;
for (let i = 1; i < n; i += 1) {
if (array[i - 1] > array[i]) {
const tmp = array[i - 1];
array[i - 1] = array[i];
array[i] = tmp; swapped = true; // 记录是否交换过元素
}
}
n = n - 1; // 最后一个元素以排好序,所以下一次它不需参与比较
} while (swapped); // 如果未发生过交换(swapped = false),则表明已经排好序,结束循环 return array;
} // 优化后的冒泡排序算法
// 来源:https://en.wikipedia.org/wiki/Bubble_sort
Sort3(originalArray) {
const array = [...originalArray]; // 在原始数组的副本上修改
let n = array.length;
do {
let newn = 0;
for (let i = 1; i < n; i += 1) {
if (array[i - 1] > array[i]) {
const tmp = array[i - 1];
array[i - 1] = array[i];
array[i] = tmp; newn = i; // 记录最后一次被交换的元素位置
}
}
n = newn; // 只需比较至上一次发生交换的地方即可
} while (n > 1); // 如果交换位置已移动到起始元素(n <= 1),则表明已经排好序,结束循环 return array;
}
}

原文地址:https://github.com/trekhleb/javascript-algorithms

Javascript 排序算法(转)的更多相关文章

  1. JavaScript 排序算法——快速排序

    常见排序 javaScript 实现的常见排序算法有:冒泡排序.选择排序.插入排序.谢尔排序.快速排序(递归).快速排序(堆栈).归并排序.堆排序. 过程 "快速排序"的思想很简单 ...

  2. JavaScript 排序算法(JavaScript sorting algorithms)

    JavaScrip 排序算法(JavaScript Sorting Algorithms) 基础构造函数 以下几种排序算法做为方法放在构造函数里. function ArrayList () { va ...

  3. JavaScript 排序算法

    排序也是在程序中经常用到的算法.无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小.如果是数字,我们可以直接比较,但如果是字符串或者两个对象呢?直接比较数学上的大小是没有意义的,因此,比较的 ...

  4. JavaScript排序算法——选择排序

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

  5. JavaScript排序算法——希尔排序

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

  6. javascript排序算法-快速排序

    快速排序 概念: (1) 首先,从数组中选择中间一项作为主元. (2) 创建两个指针,左边一个指向数组第一个项,右边一个指向数组最后一个项.移动左指针直到我们找到一个比主元大的元素,接着,移动右指针直 ...

  7. javascript排序算法-选择排序

    选择排序 概念:选择排序大致的思路是找到数据结构中的最小值并将其放置在第一位,接着找到第二小的值并将其放在第二位,以此类推. 复杂度: O(n^2) 代码实现 var swap = function ...

  8. javascript排序算法-归并排序

    归并排序 概念:归并排序是一种分治算法.其思想是将原始数组切分成较小的数组,直到每个小数组只有一个位置,接着将小数组归并成较大的数组,直到最后只有一个排序完毕的大数组. 时间复杂度: O(nlogn) ...

  9. JavaScript排序算法——冒泡排序

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

随机推荐

  1. codevs——1385 挤牛奶

    1385 挤牛奶 USACO  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 青铜 Bronze 题解  查看运行结果     题目描述 Description 三个农民每天清 ...

  2. JDBC中的批处理

    以下内容引用自http://wiki.jikexueyuan.com/project/jdbc/batch-processing.html: 批处理是指将关联的SQL语句组合成一个批处理,并将他们当成 ...

  3. Servlet基础教程:tutorialspoint-servlet

    来自turorialspoint的Servlet基础教程(英文),官网:https://www.tutorialspoint.com/servlets/index.htm 这个教程在国内已经被翻译成中 ...

  4. ibatis中isNotNull与isNotEmpty区别

    isNotNull:参数不能为null,空的可以的 isNotEmpty:参数不能为null和空 那什么是空?比如String类型 String a = ""; a就是空

  5. test markdown 写博客

    欢迎使用 Cmd Markdown 编辑阅读器 我们理解您需要更便捷更高效的工具记录思想,整理笔记.知识,并将其中承载的价值传播给他人,Cmd Markdown 是我们给出的答案 -- 我们为记录思想 ...

  6. Linux 下添加 Eclipse 桌面图标

    1. sudo gedit  /usr/share/applications/eclipse.desktop 2. 向eclipse .desktop中添加以下内容: [Desktop Entry] ...

  7. JavaSE入门学习5:Java基础语法之keyword,标识符,凝视,常量和变量

    一keyword keyword概述:Java语言中有一些具有特殊用途的词被称为keyword.keyword对Java的编译器有着特殊的意义.在程 序中应用时一定要谨慎. keyword特点:组成k ...

  8. Qt 插件综合编程-基于插件的OpenStreetMap瓦片查看器client(5) 小结

    经过不断试用与改动,这个查看器终于还是完毕了设计.实现.查看器,顾名思义,没有编辑功能:说的白一点,仅仅是一个以OpenStreetMap为底图的显示装置罢了.和专业GIS相比,这款基于插件的Open ...

  9. WEB安全实战(四)关于 Cookie

    前言 这几天中,一直再跟漏洞打交道,而在这些漏洞中,出现的最多的就是 Cookie 和 Session 了.这篇文章就简单的介绍一些 Cookie 中最经常使用的四个属性.也算是为兴许的文章做一个铺垫 ...

  10. PNG vs. GIF vs. JPEG vs. SVG - When best to use?

    image - PNG vs. GIF vs. JPEG vs. SVG - When best to use? - Stack Overflow https://stackoverflow.com/ ...