JavaScript实现各种排序算法
前言:本文主要是用JavaScript
实现数据结构中的各种排序算法,例如:插入排序
、希尔排序、合并排序等。
冒泡排序
function bubbleSort(arr) {
console.time("冒泡排序")var num = 0;
for (var i = arr.length; i > num; num++) {
for (var j = i - 1; j > num; j--) {
if(arr[j-1]>arr[j]){
var temp = arr[j-1];
arr[j-1] = arr[j];
arr[j] = temp;
}
}
}
console.timeEnd("冒泡排序")
return arr
}
var arr = [12, 290, 219, 278, 4432,21, 43, 89, 78];
console.log( bubbleSort(arr));
时间复杂度: 最差 O(n2) ; 最优 O(n)
插入排序
插入排序的基本原理如下图:从前向后构建有序序列,对于未排序序列,在已排序的序列中从后向前扫描插入位置,对于第p个元素,需要扫描p-1次,平均来说插入排序算法复杂度为O(n2)
function insertSort(arr) {
console.time("插入排序") var len = arr.length; if (len <= 1) {
return arr;
} // 1~n-1趟排序
arr.map(function(item,index){
if(index>0){
for (var j = index; j > 0 && arr[j - 1] > item; j--) {
arr[j] = arr[j - 1];
}
arr[j] = item;
}
});
console.timeEnd("插入排序")
return arr
}
var arr = [12, 290, 219, 278, 4432, 21, 43, 89, 78];
console.log(insertSort(arr));
希尔排序
shell排序也称为递减增量排序,效果比插入排序更好,对于不同的增量,排序性能也不同
下面我们看看 步长选择为并且对步长取半直到步长达到1的算法实现。
function shellSort(arr) {
console.time("希尔排序")
var gap, i, j;
var temp;
for (gap = arr.length >> 1; gap > 0; gap >>= 1)
for (i = gap; i < arr.length; i++) {
temp = arr[i];
for (j = i - gap; j >= 0 && arr[j] > temp; j -= gap)
arr[j + gap] = arr[j];
arr[j + gap] = temp;
}
console.timeEnd("希尔排序")
return arr
}
var arr = [12, 290, 219, 278, 4432, 21, 43, 89, 78];
console.log(shellSort(arr));
算法实现过程如下:这里我们选择 步长为4:(每一列相当于一次插入排序)
12 190 219 278
4432 21 43 89
78
// 第一次排序之后得到:
12 21 43 89
78 190 219 278
4432 // 连接起来得到的是 [12,21,43,89,78,190,219,278,4432],接着以2为步长 排序之后变为:
12 21
43 89
78 190
219 278
4432 // 然后就是简单的插入排序
平均时间复杂度为:
快速排序
快排的思想也很简单,以升序为例,在序列中选一标杆,一般讲第一个元素作为标杆,然后将序列中比标杆小的元素放到标杆左边,将比标杆大的放到标杆右边。然后分别在左右两边重复这样的操作。
快速排序的关键在于选取中心枢纽povit,该值可以随机选择,但是不同的选择会有所影响,在这里我直接选择了最左端的元素
void ksort(int a[], int l, int r) {
// 长度小于2有序
if (r - l < 2) return;
int start = l, end = r;
while (l < r) {
// 向右去找到第一个比标杆大的数
while (++l < end && a[l] <= a[start]);
// 向左去找第一个比标杆小的数9 while(--r > start && a[r] >= a[start]);
if (l < r) swap(a[l], a[r]); // 前面找到的两个数相对于标杆逆序 ,需交换过来 。l==r 不需要交换,
}
swap(a[start], a[r]); // 将标杆挪到正确的位置.
// 对标杆左右两边重复算法,注意,这个l已经跑到r后面去了
ksort(a, start, r);
ksort(a, l, end);
}
快速排序实现2: (以中间的为基准值)
function qSort(arr) {
if (arr.length <= 1) {
return arr;
}
var num = Math.floor(arr.length / 2); var numValue = arr.splice(num, 1)[0];
var left = [],
right = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i] < numValue) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return qSort(left)
.concat([numValue], qSort(right))
} console.log(qSort([32, 45, 37, 16, 2, 87]))
快速排序的平均时间复杂度为O(NLogN)
合并排序
合并排序采用分治法的思想对数组进行分治,对半分开,分别对左右两边进行排序,然后将排序后的结果进行合并。按照这样的思想,递归做是最方便的。
int a[N], c[N];
void mergeSort(l, r) {
int mid, i, j, tmp;
if (r - 1 > l) {
mid = (l + r) >> 1;
// 分别最左右两天排序
mergeSort(l, mid);
mergeSort(mid, r);
// 合并排序后的数组
tmp = l;
for (i = l, j = mid; i < mid && j < r;) {
if (a[i] > a[j]) c[tmp++] = a[j++];
else c[tmp++] = a[i++];
}
// 把剩余的接上
if (j < r) {
for (; j < r; j++) c[tmp++] = a[j];
} else {
for (; i < mid; i++) c[tmp++] = a[i];
}
// 将c数组覆盖到a里
for (i = l; i < r; i++) {
a[i] = c[i];
}
}
}
结束语
更新几种排序算法的实现
JavaScript实现各种排序算法的更多相关文章
- javascript 中合并排序算法 详解
javascript 中合并排序算法 详解 我会通过程序的执行过程来给大家合并排序是如何排序的... 合并排序代码如下: <script type="text/javascript& ...
- 用javascript实现简单排序算法
声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢! 本文为楼主自己的学习记录文章,若有不当之处请斧正. 本文主要记录排序算法 [冒泡排序] 感觉这个是最简单的排序算法了.直接引用维基百科里的 ...
- JavaScript数据结构-2.排序算法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- JavaScript实现常见排序算法
列表 冒泡排序 选择排序 插入排序 快速排序 希尔排序 归并排序 冒泡排序 // 输入:[5, 6, 3, 4, 8, 0, 1, 4, 7] // 输出:[0, 1, 3, 4, 4, 5, 6, ...
- JavaScript 常用的排序算法
冒泡排序 function bubbleSort(array) { for (let i = 0; i < array.length; i++) for (let j = 0; j < a ...
- JavaScript实现常用的排序算法
▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...
- 十大经典排序算法总结(JavaScript描述)
前言 读者自行尝试可以想看源码戳这,博主在github建了个库,读者可以Clone下来本地尝试.此博文配合源码体验更棒哦~~~ 个人博客:Damonare的个人博客 原文地址:十大经典算法总结 这世界 ...
- javascript数据结构与算法--高级排序算法
javascript数据结构与算法--高级排序算法 高级排序算法是处理大型数据集的最高效排序算法,它是处理的数据集可以达到上百万个元素,而不仅仅是几百个或者几千个.现在我们来学习下2种高级排序算法-- ...
- 转载部长一篇大作:常用排序算法之JavaScript实现
转载部长一篇大作:常用排序算法之JavaScript实现 注:本文是转载实验室同门王部长的大作,找实习找工作在即,本文颇有用处!原文出处:http://www.cnblogs.com/ywang172 ...
随机推荐
- SDU暑期集训排位(9)
SDU暑期集训排位(9) G. Just Some Permutations 基础 DP 练习部分 定义 \(f(S)\),表示让 S 中的人全 happy 的方案数. \(dp[i][j]\) 表示 ...
- 牛客暑假多校第五场 I vcd
这个题目一个队友没读懂, 然后我读错了题目, 还让他堆了半天的公式写了半天的代码, 交上去一直0.0, 另一队友问题目有没有读错, 我坚持没有读错, 然后坑了2个小时的时间,不然应该会早一点做出来. ...
- bzoj 4025 二分图 lct
题目传送门 题解: 首先关于二分图的性质, 就是没有奇环边. 题目其实就是让你判断每个时段之内有没有奇环. 其次 lct 只能维护树,(反正对于我这种菜鸟选手只会维护树), 那么对于一棵树来说, 填上 ...
- CodeForces 758 D Ability To Convert
Ability To Convert 题意:给你一个n进制的60位的数,但是由于Alexander只会写0->9,所以他就会用10来表示十而不是A(假设进制>10); 题解:模拟就好了,先 ...
- 漫谈Spring Security 在Spring Boot 2.x endpoints中的应用(一)
Spring Boot 2.x极大简化了默认的安全配置,并不是说有很多安全相关的配置,现在你只需要提供一个WebSecurityConfigurerAdapter继承类这样一个简单的操作,Spring ...
- 【2】KNN:约会对象分类器
前言 这是一个KNN算法的应用实例,参考<机器学习实战>中的datingTestSet2.txt的数据集. 可以通过对不同约会对象的特征进行分析然后自动得出以下三种结论: 不喜欢的 有点魅 ...
- python每日经典算法题5(基础题)+1(中难题)
现在,越来越多的公司面试以及考验面试对算法要求都提高了一个层次,从现在,我讲每日抽出时间进行5+1算法题讲解,5是指基础题,1是指1道中等偏难.希望能够让大家熟练掌握python的语法结构已经一些高级 ...
- dubbo 的 spi 思想是什么?
面试题 dubbo 的 spi 思想是什么? 面试官心理分析 继续深入问呗,前面一些基础性的东西问完了,确定你应该都 ok,了解 dubbo 的一些基本东西,那么问个稍微难一点点的问题,就是 spi, ...
- 利用github搭建私人maven仓库
一.背景 最近在做HBase的项目,不免会引用到一些工具类,如StringUtils,NumberUtils,DateUtils这些,公司底层有封装好可以直接使用. 但是项目完成,用maven打包部署 ...
- python django+bootstrap4+mysql智慧交通系统构建
之前,我做了一个实训的项目,但是一直没有展示如何做的,现在就让我讲解一下如何用django+bootstrap4+mysql实现这个智慧交通系统.这里用到的是网页的bootstrap4框架和mysql ...