js实现冒泡排序(bubble sort)快速排序(quick sort)归并排序(merge sort)
排序问题相信大家都比较熟悉了。用js简单写了一下几种常用的排序实现。其中使用了es6的一些语法,并且不仅限于数字——支持各种类型的数据的排序。那么直接上代码:
function compare (a, b) {
return (a - b) > 0;
}
// 冒泡排序O(n^2)
const bubbleSort = function (arrayData, compareFn = compare) {
let len = arrayData.length;
for (let i = len - 1; i > 0; i--) {
for (let j = 0; j < i; j++) {
if (compareFn(arrayData[j], arrayData[j + 1])) {
[arrayData[j], arrayData[j + 1]] = [arrayData[j + 1], arrayData[j]];
}
}
}
}
// 快速排序 O(n*logn)
function getMid (arrayData) {
return arrayData[0];
}
const quickSort = function (arrayData, compareFn = compare, getMidFn = getMid) {
let len = arrayData.length;
if (len < 2) {
return arrayData;
}
let mid = getMidFn(arrayData);
let smallGroup = [];
let largeGroup = [];
let midGroup = [];
for (let i = 0; i < len; i++) {
if (compareFn(mid, arrayData[i])) {
smallGroup.push(arrayData[i]);
} else if (compareFn(arrayData[i], mid)) {
largeGroup.push(arrayData[i]);
} else {
midGroup.push(arrayData[i]);
}
}
return [...quickSort(smallGroup, compareFn, getMidFn), ...midGroup, ...quickSort(largeGroup, compareFn, getMidFn)];
}
// 归并排序 O(n*logn)
const mergeSort = function (arrayData, compareFn = compare) {
let merge = function (leftArray, rightArray, compareFn) {
let resultArray = [];
while (leftArray.length > 0 && rightArray.length > 0) {
if (compareFn(leftArray[0], rightArray[0])) {
resultArray.push(leftArray.shift());
} else {
resultArray.push(rightArray.shift());
}
}
return resultArray = resultArray.concat(leftArray, rightArray);
}
if (arrayData.length <= 1) {
return arrayData;
}
let midIndex = parseInt(arrayData.length / 2);
let leftArray = arrayData.slice(0, midIndex);
let rightArray = arrayData.slice(midIndex);
return merge(mergeSort(leftArray, compareFn), mergeSort(rightArray, compareFn), compareFn);
}
// test codes
// let strArray = ['a', 'c', 'b', 'e', 'd']
// strArray = mergeSort(strArray, (a, b) => {
// return (a.codePointAt() - b.codePointAt()) > 0;
// });
// console.log(strArray);
// let strArray = ['a', 'c', 'b', 'e', 'd']
// bubbleSort(strArray, (a, b) => {
// return (a.codePointAt() - b.codePointAt()) > 0;
// });
// console.log(strArray);
通过自定义campare函数,用户可以对任意类型的数据,使用任意的方式进行排序。快速排序允许用户自定义取中间值的方法,可以结合实际情况,更好的提升排序效率。
js实现冒泡排序(bubble sort)快速排序(quick sort)归并排序(merge sort)的更多相关文章
- 连续线性空间排序 起泡排序(bubble sort),归并排序(merge sort)
连续线性空间排序 起泡排序(bubble sort),归并排序(merge sort) 1,起泡排序(bubble sort),大致有三种算法 基本版,全扫描. 提前终止版,如果发现前区里没有发生交换 ...
- 经典排序算法 - 归并排序Merge sort
经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到所有合并完,形成有序的数组 举例 无序数组[6 2 ...
- 排序算法二:归并排序(Merge sort)
归并排序(Merge sort)用到了分治思想,即分-治-合三步,算法平均时间复杂度是O(nlgn). (一)算法实现 private void merge_sort(int[] array, int ...
- 归并排序(merge sort)
M erge sort is based on the divide-and-conquer paradigm. Its worst-case running time has a lower ord ...
- swift冒泡排序,swift快速排序,swift归并排序,swift插入排序,swift基数排序
import UIKit /// 冒泡 /// ///时O(n2),空O(1) 稳定排序 func Mysort(arr:[Int]) -> [Int]{ var transArr = arr ...
- 归并排序Merge Sort
//C语言实现 void mergeSort(int array[],int first, int last) { if (first < last)//拆分数列中元素只剩下两个的时候,不再拆分 ...
- 归并排序——Merge Sort
基本思想:参考 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法的一个非常典型的应用.首先考虑下如何将2个有序数列合并.这个非常简单,只要从比较2个数列的第一个数,谁小就先取谁,取了 ...
- 归并排序Merge sort(转)
原理,把原始数组分成若干子数组,对每一个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到全部合并完,形成有序的数组 举例 无序数组[6 2 4 1 5 9] 先看一下每个步骤下的状态, ...
- 数据结构 - 归并排序(merging sort)
归并排序(merging sort): 包含2-路归并排序, 把数组拆分成两段, 使用递归, 将两个有序表合成一个新的有序表. 归并排序(merge sort)的时间复杂度是O(nlogn), 实际效 ...
- 数据结构 - 归并排序(merging sort) 具体解释 及 代码
归并排序(merging sort) 具体解释 及 代码 本文地址: http://blog.csdn.net/caroline_wendy 归并排序(merging sort): 包括2-路归并排序 ...
随机推荐
- kettle6.1如何连接mongodb
. Kettle的结构图如下: 2.介绍各个组件详细情况 表输入:通常是你的sql语句,这个会Kettle基础知识的都会不介绍了 JSON Output如下: MogoDB output如下: 下面这 ...
- 建议收藏备用:.net core使用QRCoder生成普通二维码和带Logo的二维码详细使用教程,源码已更新至开源模板
随着互联网越来越生活化,二维码的使用越来越普遍,不论是扫码支付还是扫码关注引流,似乎我们总是离不开二维码,那么很多需要推广的文章或社区想要自己的二维码,那么你是不是需要在网站直接提供给用户呢?很多开发 ...
- python学习之【第三篇】:Python中的字符串及其所具有的方法
1.前言 字符串str是Python中最常用的数据类型.我们可以使用单引号''或双引号""包裹一段字符来创建字符串. 2.字符串创建 str1 = 'hello world' st ...
- 大数据之路day05_1--初识类、对象
1.1 什么是面向对象 面向对象思想就是不断的创建对象(属性与行为的封装,让二者作为整体参与程序执行),使用对象,指挥对象做事情.(在已有对象的情况下,直接使用对象,而不再去考虑对象的内 ...
- LINQ学习——JOIN
一.JOIN的作用 1.使用联接来结合两个或更多的集合的数据. 2.联接操作接受两个集合然后创建一个临时的对象集合,每一个对象包含原始集合对象中的所有字段. Note:这里是包含而不是这个原实集合的字 ...
- CSS3解决字母不换行的方法
CSS3解决字母不换行的方法 <pre>word-wrap: break-word;</pre>
- Docker(二) Dockerfile 使用介绍
前言 图解Docker 镜像.容器和 Dockerfile 的关系: 一.Dockerfile的概念 Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序.库.资源.配置等文件外,还包 ...
- 7月22 Linux作业-文件管理
习题内容 解答 1.答案 [root@centos7 ~]# echo '*/1 * * * * /usr/bin/cp /etc /data/`/usr/bin/date +\%Y-\%m-\%d` ...
- 比较器中的comparing方法以及涉及到的知识
今天在学习Java核心技术集合程序清单9-3时遇到了问题. 代码如下 public class TreeSetTest { public static void main(String[] args) ...
- python快速获取网页标准表格内容
from html_table_parser import HTMLTableParser def tableParse(value): p = HTMLTableParser() p.feed(va ...