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-路归并排序 ...
随机推荐
- [考试反思]0918csp-s模拟测试46:残存
我... 行吧大概说说. T1打的n2dp,什么随机化什么改变读入顺序都能AC. 没想优化.打了个链表优化dp.不知为何WA了. T2读错题,死了. T3的50分暴力没来得及优化感觉思路很神仙(然而并 ...
- [考试反思]0815NOIP模拟测试22
40分,15名. 1-4:120 75 70 70 35分20名...总之差距极小不想说了 昨天教练说:以后的考试还是联赛知识点,但是难度比联赛高. 没听进去,以为是对于所有人而言的,也就是T1难度变 ...
- Intellij IDEA配置JDK、Maven和Tomcat
一.配置JDK 1.File-->Project Structure 2.选择SDKs 3.点击+号添加自己本地jdk的安装目录,保存即可 二.配置Maven 1.File -> Othe ...
- 5种常见Bean映射工具的性能比对
本文由 JavaGuide 翻译自 https://www.baeldung.com/java-performance-mapping-frameworks .转载请注明原文地址以及翻译作者. 1. ...
- Tomcat+nginx+Keepalived部署实现集群
Tomcat+nginx+Keepalived部署实现集群 环境说明: 系统:Centos-7 主机:Centos-7 x3 IP地址: 服务器1(192.168.10.102/24) 服务器2(19 ...
- day-5元组专区
*元组,元素不可被修改,不能被增加或者删除tupletu = (11,22,33,44)tu.count(22),获取指定元素在元组中出现的次数tu.index(22),索引22在元组中位置(左到右第 ...
- 利用Python获取统计自己的qq群成员信息
利用python获取自己的qq群成员信息! 首先说明一下需要使用的工具以及技术:python3 + selenium selenium安装方法:pip install selenium 前提:获取自己 ...
- maven(1)
Maven进价:Maven的生命周期阶段 一.Maven的生命周期 Maven的生命周期就是对所有的构建过程进行抽象和统一.包含了项目的清理.初始化.编译.测试.打包.集成测试.验证.部署和站点生成等 ...
- (C#)WPF:.h(头文件)、.lib(静态链接库文件)和.dll(动态链接库文件)之间的区别与联系
静态链接库(Lib)与动态链接库(DLL)的区别 静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件:动态链接就是把调用的函数所在文件模块(DLL)和 ...
- Java开发者入职必备条件
01.基础技术体系 我认为知识技能体系化是判断技术是否过关的第一步.知识体系化包含两层含义: 1. 能够知道技术知识图谱(高清版图谱扫文末二维码)的内容 比如分布式系统中常用的RPC技术,其背后就涉及 ...