排序问题相信大家都比较熟悉了。用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)的更多相关文章

  1. 连续线性空间排序 起泡排序(bubble sort),归并排序(merge sort)

    连续线性空间排序 起泡排序(bubble sort),归并排序(merge sort) 1,起泡排序(bubble sort),大致有三种算法 基本版,全扫描. 提前终止版,如果发现前区里没有发生交换 ...

  2. 经典排序算法 - 归并排序Merge sort

    经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到所有合并完,形成有序的数组 举例 无序数组[6 2 ...

  3. 排序算法二:归并排序(Merge sort)

    归并排序(Merge sort)用到了分治思想,即分-治-合三步,算法平均时间复杂度是O(nlgn). (一)算法实现 private void merge_sort(int[] array, int ...

  4. 归并排序(merge sort)

    M erge sort is based on the divide-and-conquer paradigm. Its worst-case running time has a lower ord ...

  5. swift冒泡排序,swift快速排序,swift归并排序,swift插入排序,swift基数排序

    import UIKit /// 冒泡 /// ///时O(n2),空O(1) 稳定排序 func Mysort(arr:[Int]) -> [Int]{ var transArr = arr ...

  6. 归并排序Merge Sort

    //C语言实现 void mergeSort(int array[],int first, int last) { if (first < last)//拆分数列中元素只剩下两个的时候,不再拆分 ...

  7. 归并排序——Merge Sort

    基本思想:参考 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法的一个非常典型的应用.首先考虑下如何将2个有序数列合并.这个非常简单,只要从比较2个数列的第一个数,谁小就先取谁,取了 ...

  8. 归并排序Merge sort(转)

    原理,把原始数组分成若干子数组,对每一个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到全部合并完,形成有序的数组 举例 无序数组[6 2 4 1 5 9] 先看一下每个步骤下的状态, ...

  9. 数据结构 - 归并排序(merging sort)

    归并排序(merging sort): 包含2-路归并排序, 把数组拆分成两段, 使用递归, 将两个有序表合成一个新的有序表. 归并排序(merge sort)的时间复杂度是O(nlogn), 实际效 ...

  10. 数据结构 - 归并排序(merging sort) 具体解释 及 代码

    归并排序(merging sort) 具体解释 及 代码 本文地址: http://blog.csdn.net/caroline_wendy 归并排序(merging sort): 包括2-路归并排序 ...

随机推荐

  1. 关于 Java 中多线程的面试问题 详解

    多线程细节: 1. 面试题: sleep 方法 和 wait 方法异同点是什么? 相同点: 可以让线程 处于 冻结状态. 不同点: 1. sleep 必须指定时间 wait 可以指定时间, 也可以不指 ...

  2. [考试反思]0811NOIP模拟测试17:虚无

    (sdfz未参加,也就是一共就51个人) 也不粘具体排名了,只写分数线. []220 []201 []194 [5]181 [10]141 [15]132 [20]122 [25]116 [30]10 ...

  3. NOIP模拟 32

    我在31反思中膜拜过了B哥 没想到这次又... 我给老姚家丢脸了...STO 首先T1暴力就写挂了... 贪图从$n^3$*$2^n$优化成$n^2$*$2^n$然后打错了 哗哗的扔分 而且正解都想不 ...

  4. Docker的Ubuntu16.04容器如何汉化

    最近发现docker hub中的vnc镜像大部分是没有安装语言包的,试了好多天才把他搞出来. 下面为实现步奏. 网盘软件地址 ://pan.baidu.com/share/link?shareid=3 ...

  5. 表格导出到excel的样式消失该如何修改

    工作中遇到一需求,要将后台的表格导出到excel后的表格样式该如何修改呢? 其实表格导出首先需要了解两个插件:jquery.table2excel.js和tableExport.js 1.第一步,写一 ...

  6. 【RocketMQ源码学习】- 3. Client 发送同步消息

    本文较长,代码后面给了方法简图,希望给你帮助 发送的方式 同步发送 异步发送 消息的类型 普通消息 顺序消息 事务消息 发送同步消息的时序图 为了防止读者朋友嫌烦,可以看下时序图,后面我也会给出方法的 ...

  7. 七月月赛T1

    题目背景 借助反作弊系统,一些在月赛有抄袭作弊行为的选手被抓出来了! 题目描述 现有 2^n\times 2^n (n\le10)2n×2n(n≤10) 名作弊者站成一个正方形方阵等候 kkksc03 ...

  8. CSS(6)---通俗讲解浮动(float)

    CSS(6)---通俗讲解浮动(float) CSS有三模块:盒子模型.浮动 .定位.上篇博客有讲到 盒子模型地址:CSS(5)---通俗讲解盒子模型 一.理解浮动 1.概念 概念 浮动可以理解为让某 ...

  9. heml基础笔记

    1.html:全名是超文本标记语言, hyper text mark language 2.html的标签 <p> :  <+和标签名 p+>结合而成. 每个标签都有自己的结束 ...

  10. nyoj 35-表达式求值(stack, 栈的应用)

    35-表达式求值 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:37 submit:53 题目描述: ACM队的mdd想做一个计算器,但是,他要做的 ...