Javascript 排序算法(转)
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 排序算法(转)的更多相关文章
- JavaScript 排序算法——快速排序
常见排序 javaScript 实现的常见排序算法有:冒泡排序.选择排序.插入排序.谢尔排序.快速排序(递归).快速排序(堆栈).归并排序.堆排序. 过程 "快速排序"的思想很简单 ...
- JavaScript 排序算法(JavaScript sorting algorithms)
JavaScrip 排序算法(JavaScript Sorting Algorithms) 基础构造函数 以下几种排序算法做为方法放在构造函数里. function ArrayList () { va ...
- JavaScript 排序算法
排序也是在程序中经常用到的算法.无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小.如果是数字,我们可以直接比较,但如果是字符串或者两个对象呢?直接比较数学上的大小是没有意义的,因此,比较的 ...
- JavaScript排序算法——选择排序
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- JavaScript排序算法——希尔排序
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- javascript排序算法-快速排序
快速排序 概念: (1) 首先,从数组中选择中间一项作为主元. (2) 创建两个指针,左边一个指向数组第一个项,右边一个指向数组最后一个项.移动左指针直到我们找到一个比主元大的元素,接着,移动右指针直 ...
- javascript排序算法-选择排序
选择排序 概念:选择排序大致的思路是找到数据结构中的最小值并将其放置在第一位,接着找到第二小的值并将其放在第二位,以此类推. 复杂度: O(n^2) 代码实现 var swap = function ...
- javascript排序算法-归并排序
归并排序 概念:归并排序是一种分治算法.其思想是将原始数组切分成较小的数组,直到每个小数组只有一个位置,接着将小数组归并成较大的数组,直到最后只有一个排序完毕的大数组. 时间复杂度: O(nlogn) ...
- JavaScript排序算法——冒泡排序
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
随机推荐
- csu - 1538: Shopping (贪心)
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1538 很奇妙的一个题,开始没有思路.问了别人才知道. 题目的意思可以理解成上图中,从0点开始向右走 ...
- MongoDB环境搭建教程收集(待实践)
先收集,后续再实践. https://my.oschina.net/leezhen/blog/207262 http://www.360doc.com/content/11/0708/09/26606 ...
- import与require的区别
载入一个模块import() 与 require() 功能相同,但具有一定程度的自动化特性.假设我们有如下的目录结构:~~~app/app/classes/app/classes/MyClass.lu ...
- Django学习系列之中间件
中间件的定义 中间件是一个.一个的管道,如果相对任何所有的通过Django的请求进行管理都需要自定义中间件 中间件可以对进来的请求和出去的请求进行控制 中间件是一类 django请求生命周期 自定义中 ...
- HTTP请求方式之GET和POST比较
什么是HTTP协议 超文本传输协议(HyperText Transfer Protocol -- HTTP)是一个设计来使客户端和服务器顺利进行通讯的协议 HTTP在客户端和服务器之间以request ...
- windows 7 文件加密设置
方法/步骤1 加密文件 1 右击需加密的文件,选择“属性”命令. 2 在属性对话框的“常规‘选项卡中单击”高级“按钮. 3 在弹出的对话框中选中”加密内容以便保护数据“复选框,单击”确定“按钮. 4 ...
- jQuery—— jQuery get方法+一般处理程序处理文本框内容
网上常常看到这种交互方式,当去一个站点注冊username的时候,假设文本框内没有输入数据,或者数据输入的内容格式不正确.就会将文本框变成红色来提示你输入的内容有误. 自己将这个文本框验证的方式改变了 ...
- matlab Newton method
% Matlab script to illustrate Newton's method % to solve a nonlinear equation % this particular scri ...
- lua遍历目录
require"lfs" function findindir (path, wefind, r_table, intofolder) for file in lfs.dir(pa ...
- 2016/1/22 1, 1-100 放集合 特定对象移除 2,List集合和Set集合是否可以重复添加
package shuzu; import java.awt.List; import java.util.*; public class ListIterator { public static v ...


