排序算法的JS实现
排序算法是基础算法,虽然关键在于算法的思想而不是语言,但还是决定借助算法可视化工具结合自己常用的语言实现一下
1.冒泡排序
基本思路:依次比较两两相邻的两个数,前面数比后面数小,不变。前面数比后面数大,交换顺序。一轮下来,最后的一个数是最大的数。
外循环每增加一次,内循环减少一次。
图形展示:

function bubbleSort(arr){
for (var i = 0; i < arr.length; i++) {
for (var j = 0; j< arr.length-i-1; j++) {
if(arr[j]>arr[j+1]){
var temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
return arr;
}
2.选择排序
基本思路:循环数组,找出最小的值,和第一个交换位置;然后在剩下的数中,找出第二小的数,放在第二个;依次类推。
图形展示:

function selectSort(arr){
for( var i=0;i<arr.length-1;i++){
var min=i;
for(var j=i+1;j<arr.length;j++){
if(arr[j]<arr[min]){
min=j;
}
if(i!=min){
var temp=arr[i];
arr[i]=arr[min];
arr[min]=temp;
}
}
}
return arr;
}
3.插入排序
基本思路:把数组分为[已排序]和[未排序]两部分,第一个数为[已排序],其余为[未排序];
从[未排序]中抽出一个数,和[已排序]部分比较,插入到合适位置。
图形展示:

function insert(arr){
for(var i=0;i<arr.length;i++){
var value=arr[i]; //i表示未排序部分的当前位置,value表示当前比较的元素
for(var j=i-1;j>=0&&value<arr[j];j--){ //j表示已排序部分的当前位置
arr[j+1]=arr[j];
}
arr[j+1]=value;
}
return arr;
}
4、合并排序
基本思路:不断的将数组对半分,只到每个数组只有一个元素;
将分出来的部分重新合并,合并的时候按顺序排列。
图形展示:

方法一
function mergeSort(arr){
if(arr.length<2){
return arr;
}
var middle=Math.floor(arr.length/2),
left=arr.slice(0,middle),
right=arr.slice(middle);
return merge(mergeSort(left),mergeSort(right));
}
function merge(left,right){
var result=[];
while(left.length>0 && right.length>0){
if(left[0]<=right[0]){
result.push(left.shift());
}else{
result.push(right.shift());
}
}
// while(left.length){
// result.push(left.shift());
// }
// while(right.length){
// result.push(right.shift());
// }
if(left.length){
result=result.concat(left);
}
if(right.length){
result=result.concat(right)
}
return result;
}
方法二
function mergeSort(arr){
//只有一个数的时候退出递归
if(arr.length<2){
return arr;
}
//递归
var middle=Math.floor(arr.length/2),
left=arr.slice(0,middle),
right=arr.slice(middle);
return merge(mergeSort(left),mergeSort(right))
}
//将两个数组合并;合并的时候按从小到大的顺序
function merge(left,right){
var left_index=0,
right_index=0,
result=[];
while(left_index<left.length&&right_index<right.length){
if(left[left_index]<right[right_index]){
result.push(left[left_index++]);
}else{
result.push(right[right_index++]);
}
}
return result.concat(left.slice(left_index),right.slice(right_index));
5.快速排序
基本思路:以一个数为基准,比基准小的数放到左边,比基准大的值放右边;递归进行,不能再分后退出递归
图形展示:

方法一:以中间值为基准,这种方法创建了两个新数组,暂用空间
function quickSort(arr){
if(arr.length<2){
return arr;
}
var base=Math.floor(arr.length/2);
var pirot=arr.splice(base,1)[0]; //基准值
var left=[],
right=[];
for(var i=0;i<arr.length;i++){
if(arr[i]<pirot){
left.push(arr[i]);
}else{
right.push(arr[i]);
}
}
// 递归,把数组合并在一起把数组合并在一起
return quickSort(left).concat([pirot],quickSort(right));
}
方法二,以第一个值为基准,先向从右往左,找比它小的值;再从左向右找比它大的值
var quickSort = function(arr, head, tail) {
if (head > tail) {
return;
}
var i=head;
var j=tail;
var Pivot=arr[i]; /**< 选取基准值 */
while (i<j) {
//使用j,从序列最右端开始扫描,直到遇到比基准值小的数
while ((i<j) && (Pivot <= arr[j])) {
j--;
}
//交换位置
if (i<j) {
arr[i++]=arr[j];
}
//使用i,从序列最左端开始扫描,直到遇到比基准值大的数
while ( (i<j) && (Pivot >=arr[i]) ) {
i++;
}
//交换位置
if (i<j) {
arr[j--]=arr[i];
}
}
//最后填入基准值放入合适的位置
arr[j]=Pivot;
//对基准值两边序列进行排序的递归调用
quickSort(arr, head, i-1);
quickSort(arr, i+1, tail);
return arr;
}
排序算法的JS实现的更多相关文章
- 常见排序算法(JS版)
常见排序算法(JS版)包括: 内置排序,冒泡排序,选择排序,插入排序,希尔排序,快速排序(递归 & 堆栈),归并排序,堆排序,以及分析每种排序算法的执行时间. index.html <! ...
- 常见排序算法基于JS的实现
一:冒泡排序 1. 原理 a. 从头开始比较相邻的两个待排序元素,如果前面元素大于后面元素,就将二个元素位置互换 b. 这样对序列的第0个元素到n-1个元素进行一次遍历后,最大的一个元素就“沉”到序列 ...
- 冒泡排序算法和简单选择排序算法的js实现
之前已经介绍过冒泡排序算法和简单选择排序算法和原理,现在有Js实现. 冒泡排序算法 let dat=[5, 8, 10, 3, 2, 18, 17, 9]; function bubbleSort(d ...
- 十大经典排序算法的JS版
前言 个人博客:Damonare的个人博客 如遇到问题或有更好的优化方法,可以: 提issue给我 或是pull requests 我都会看到并处理,欢迎Star. 这世界上总存在着那么一些看似相似但 ...
- 各种排序算法(JS实现)
目录: 直接插入排序.希尔排序.简单选择排序.堆排序.冒泡排序.快速排序,归并排序.桶排序.基数排序.多关键字排序.总结 JS测试代码 function genArr(){ let n = Math. ...
- 几个排序算法的JS实现
最近找工作,复习一下数据结构的知识,看到排序这一块,顺便动手改了一下. 直接插入排序: 插入排序就是把数据分为有序区和无序区,遍历到的数据和有序区域的数据进行比较,找到要插入的位置,插入位置后的数据做 ...
- 几种经典排序算法的JS实现
一.冒泡排序 function BubbleSort(array) { var length = array.length; for (var i = length - 1; i > 0; i- ...
- 8大排序算法总结 JS 实现
//bubble sort ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 fun ...
- JS写的排序算法演示
看到网上有老外写的,就拿起自已之前完成的jmgraph画图组件也写了一个.想了解jmgraph的请移步:https://github.com/jiamao/jmgraph 当前演示请查看:http:/ ...
随机推荐
- Spring之c3p0连接池配置和使用
1.导入包:c3p0和mchange包 2.代码实现方式: package helloworld.pools; import com.mchange.v2.c3p0.ComboPooledDataSo ...
- BOM之screen对象
前面的话 screen对象在javascript编程中,比较冷门,不太常用.screen对象用来表明客户端的能力,其中包括浏览器窗口外部的显示器的信息,如像素高度和宽度等.本文将详细介绍screen对 ...
- salt-api安装以及简单实使用
1.安装说明 操作系统版本:CentOS Linux release 7.5.1804 (Core) saltstack版本:2018.3.2 已经关闭selinux.firewalld服务. 2.配 ...
- 本地开启apache虚拟服务器
一般来说,服务器是可以托管多个网站的,只要服务器开启虚拟主机的功能,原理是根据来源的host进行判断,不同的域名实现不同的文件访问,这样就可以实现一个服务器托管不同网站了,只要服务器的性能和带宽足够强 ...
- 【BZOJ1560】[JSOI2009]火星藏宝图(贪心,动态规划)
[BZOJ1560][JSOI2009]火星藏宝图(贪心,动态规划) 题面 BZOJ 洛谷 题解 既然所有的位置的权值都大于\(0\),那么就可以直接贪心,按照行为第一关键字,列为第二关键字,来转移. ...
- 40+ 个非常有用的 Oracle 查询语句
40+ 个非常有用的 Oracle 查询语句,主要涵盖了日期操作,获取服务器信息,获取执行状态,计算数据库大小等等方面的查询.这些是所有 Oracle 开发者都必备的技能,所以快快收藏吧! 日期/时间 ...
- mybatis异常invalid comparison: java.util.Date and java.lang.String
原文链接:http://blog.csdn.net/wanghailong_qd/article/details/50673144 mybatis异常invalid comparison: java. ...
- 移动H5开发入门教程:12点webAPP前端开发经验
如果你是一名移动H5前端开发人员,25学堂的小编认为下面的分享的12点webAPP前端开发经验是你必须掌握的基础知识点.算是一篇移动H5开发入门教程吧! 1. viewport:也就是可视区域.对于桌 ...
- HTML5 快速学习二 Canvas
本篇文章开始讲解HTML5的核心功能之一:Canvas 通过Canvas可以动态生成和展示图形.图表.图像以及动画. Canvas API功能非常多,我们将讨论最常用的功能. 我们先新建一个canva ...
- Golang的字符编码介绍
Golang的字符编码介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Go里面内建仅支持UTF8字符串编码,因此如果你用fmt.Printf之类的函数无法将GBK,GB2312 ...