排序问题相信大家都比较熟悉了。用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. 学习笔记50_mongodb

    MongoVUE,MongoDB可视化客户端: 添加一个连接: 数据库下就是集合. 实际上是json数据的集合 Mongodb->数据库->文档集合:相当于表->文档:相当于表里面的 ...

  2. Java迭代Map方法

    Map map=new HashMap(); map.put("1", "one"); map.put("2","two" ...

  3. git上传项目到github远程库

    最近在学习使用 git 上传管理项目,依照教程,建好了一个远程库,也实现了本地库与远程库的项目同步上传,但是在试着将本地库里的项目上传到另一个新建远程库时遇到了问题,一直上传不成功,经过一番查找摸索终 ...

  4. 基于docker搭建Jenkins+Gitlab+Harbor+Rancher架构实现CI/CD操作(续)

    说明:前期的安装,请转向https://www.cnblogs.com/lq-93/p/11824039.html (4).查看gitlab镜像是否启动成功 docker inspect  容器id  ...

  5. python模块——socket

    实例一. server: #socket套接字(IP + 端口号)(qq,wechat 发送接收消息依靠socket模块),cs架构import socketserver = socket.socke ...

  6. requests保存图片

    1.创建07_save_jpg.py文件 import requests #发送请求respone = requests.get("https://www.baidu.com/img/bd_ ...

  7. Centos内核参数优化

    关于内核参数优化 net.ipv4.tcp_max_tw_buckets = 6000 net.ipv4.ip_local_port_range = 1024 65000  net.ipv4.tcp_ ...

  8. AV时间戳dts,pts。从ffmpeg解码过程看过来。

    解码过程中,dts由媒体流读入的包推动(解码包中的dts标记),dts在前进.pts是在dts前进到某处(截点)而进行动作的标记. 物理时间自然流逝,dts可以被控制同步与物理时间同一脚步节奏,也可以 ...

  9. js对象的sessionStorage,判断对象相等,判断是否包含某属性

    一,storage storage只能存储字符串的数据,对于JS中常用的数组或对象却不能直接存储 因此需要借JSON进行类型转化来存储: let obj = { name:'Jim' } sessio ...

  10. FIddler+Proxifer工具对windows PC客户端进行抓包

    python的大火,带动了python爬虫. 爬虫就必定绕不开抓包. 目前最常见的就是网页抓包了,可以使用chrome进行,或者配合其他抓包软件 fiddler. 小程序有些兴起是,如跳一跳之类的,也 ...