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. ehcache、memcache、redis三大缓存比较

    最近项目组有用到这三个缓存,去各自的官方看了下,觉得还真的各有千秋!今天特意归纳下各个缓存的优缺点,仅供参考!  Ehcache 在Java项目广泛的使用.它是一个开源的.设计于提高在数据从RDBMS ...

  2. 选择器的使用(empty选择器)

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><meta ...

  3. cheat sheet (小抄的意思-考试的时候,带在路上原先抄的重要的知识点)

    Cheat Sheet,这里面有个Cheat(欺骗),想当然的话,意思肯定不好.事实上,这Cheat Sheet 的原意的确也就是“小抄”的意思.所以,字典的定义是:“A piece of paper ...

  4. C# VS如何整个项目中查找字符串

    Ctrl+F打开查找对话框,然后输入查找字符串,电机右边的小三角,选择整个解决方案,就可以遍历所有文件查找指定字符了                                

  5. 5 shell命令之tr

    这是一个奇妙的命令. tr的全拼就是translate,即翻译.有趣的是我们能够制定规则进行翻译.使用方法例如以下: tr [option] set1  [set2] tr从标准输入接受输入.然后将结 ...

  6. openstack页面自己定义插件使用具体解释(django、ajax、post)(zTree为例)

    感谢朋友支持本博客,欢迎共同探讨交流.因为能力和时间有限,错误之处在所难免,欢迎指正! 如有转载.请保留源作者博客信息. Better Me的博客:blog.csdn.net/tantexian 如需 ...

  7. 托管C++线程锁实现 c++11线程池

    托管C++线程锁实现   最近由于工作需要,开始写托管C++,由于C++11中的mutex,和future等类,托管C++不让调用(报错),所以自己实现了托管C++的线程锁. 该类可确保当一个线程位于 ...

  8. 开发人员调试工具Chrome Workspace

    Workspace是个什么样的东西呢?他可以在开发人员工具中调试改动js或者css同一时候自己主动保存文件.可以避免开发人员在工具中调试好,再到编辑器中改动一次代码的反复操作,可以提高一定的效率 配置 ...

  9. python 字符编码处理问题总结 彻底击碎乱码!

    Python中常常遇到这种字符编码问题,尤其在处理网页源代码时(特别是爬虫中): UnicodeDecodeError: 'XXX' codec can't decode bytes in posit ...

  10. ACdream 1412 DP+排列组合

    2-3 Trees Problem Description 2-3 tree is an elegant data structure invented by John Hopcroft. It is ...