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-路归并排序 ...
随机推荐
- CSPS_104
又被爆踩. 正解写挂. 暴力不会. 只会改题. 还要加油. T1 $nlog^2$是显然的 那么考虑只二分一次,就$nlog$了! 有什么能通过一次二分$O(1)$得到呢? 二分a的位置,$O(1)$ ...
- 过滤广告(只能发布 [a-zA-z0-9及汉字,;?.]) ,排除其他特殊符号
/** * 过滤广告(只能发布 [a-zA-z0-9及汉字,;?.]) ,排除其他特殊符号 * Created by 1 on 2015/8/19. */ public class FilterA ...
- SpringBoot系列之@Conditional注解用法简介
SpringBoot系列之@Conditional注解用法简介 引用Spring官方文档的说法介绍一下@Conditional注解:Spring5.0.15版本@Conditional注解官方文档 @ ...
- 你能说说Java中Comparable和Comparator的区别吗
之前面试中被问到这个问题,当时不屑(会)回答,下来特意查了查,整理如下. Java 中为我们提供了两种比较机制:Comparable 和 Comparator,二者都是用来实现对象的比较.排序. 下面 ...
- [Bootstrap] Bootstrap学习笔记
1.因为bootstrap用到了html5的特性,为了正常使用,需要在最开头加上<!DOCTYPE html> 2.Bootstrap需要JQuery才能正常工作,所以需要导入jquery ...
- 忘记Linux登录密码的破解方法
注意:1.破解方式只限于7.0以后的Linux系统. 2.要注意自己linux系统中有没有开启selinux,如果开启则在后面要建一个名为:autorelabel的隐藏文件. 1.启动Linu ...
- poj 3461 Oulipo(KMP)
Oulipo Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 49378 Accepted: 19617 Descript ...
- PhpStudy BackDoor2019 深度分析
笔者<Qftm>原文发布<合天>:https://mp.weixin.qq.com/s?__biz=MjM5MTYxNjQxOA==&mid=2652852661&am ...
- easyui+ef实现省市区三级联动
1.引用easyui样式及脚本文件 2.数据库创建表(自联表)及数据建模(Code First) use DataBase go CREATE TABLE OP_SJ ( CID UNIQUEIDEN ...
- 你必须知道的容器日志 (1) Docker logs & logging driver
本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章.监控和日志历来都是系统稳定运行和问题排查的关键,在微服务架构中,数量众多的容器以 ...