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. JavaScript高级篇之Function对象

    JavaScript高级篇之Function对象 一: Function对象引入: Function对象是js的方法对象,可以用Function实例化出任何js方法对象. 例如: <%@ pag ...

  2. Nginx+Keepalived(双机热备)搭建高可用负载均衡环境(HA)

    原文:https://my.oschina.net/xshuai/blog/917097 摘要: Nginx+Keepalived搭建高可用负载均衡环境(HA) http://blog.csdn.ne ...

  3. 如何启动/关闭weblogic

    听语音 | 浏览:7107 | 更新:2014-12-25 15:43 1 2 3 4 5 6 分步阅读 最近用到weblogic 给大家分享一下如何启动和关闭weblogic 工具/原料   电脑 ...

  4. Ubuntu下Zabbix安装及使用问题

    1.configure: error: MySQL library not found MySQL library not found root@kallen:~# apt-get install l ...

  5. 静态链表的C++实现

    静态链表是使用数组实现的能够高速插入和删除数据的链表,静态链表和链式单链表比的缺点在于链表的长度仅仅能初始化设置好,而相相应普通的顺序存储的链表,静态链表不能实现高速的读写随意的元素. 当然静态链表给 ...

  6. android的toogleButton和switch的使用方法

    这两个是button开关.监听CheckedChangeListener toggle_layout.xml: <? xml version="1.0" encoding=& ...

  7. GDI+学习之------ 画线、区域填充、写字

    <精通GDI编程>里的代码.在学习过程中对它加以总结,以防以后用到,全部代码都是在MFC 单文档中实现的,写在View::OnDraw(CDC */*pDC*/)中 画线/边框(Pen) ...

  8. linux下库的使用

    1 指定使用了什么库 -lstdc++ 这样链接的时候就会去指定的目录下找链接库,优先使用动态库.然后在elf文件中加入依赖关系,放在NEEDED中. 2 指定在哪里去找库 -Wl,-rpath,so ...

  9. qq xxs

    qq xxs qq xxs 有很多举个简单例子 : QQ空间发段文章 带上 <script> 提交(document.cookie) 到 自己服务端获取 </script> 在 ...

  10. Explicit Interface Implementation (C# Programming Guide)

    https://msdn.microsoft.com/en-us/library/ms173157.aspx If a class implements two interfaces that con ...