排序算法是基础算法,虽然关键在于算法的思想而不是语言,但还是决定借助算法可视化工具结合自己常用的语言实现一下

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实现的更多相关文章

  1. 常见排序算法(JS版)

    常见排序算法(JS版)包括: 内置排序,冒泡排序,选择排序,插入排序,希尔排序,快速排序(递归 & 堆栈),归并排序,堆排序,以及分析每种排序算法的执行时间. index.html <! ...

  2. 常见排序算法基于JS的实现

    一:冒泡排序 1. 原理 a. 从头开始比较相邻的两个待排序元素,如果前面元素大于后面元素,就将二个元素位置互换 b. 这样对序列的第0个元素到n-1个元素进行一次遍历后,最大的一个元素就“沉”到序列 ...

  3. 冒泡排序算法和简单选择排序算法的js实现

    之前已经介绍过冒泡排序算法和简单选择排序算法和原理,现在有Js实现. 冒泡排序算法 let dat=[5, 8, 10, 3, 2, 18, 17, 9]; function bubbleSort(d ...

  4. 十大经典排序算法的JS版

    前言 个人博客:Damonare的个人博客 如遇到问题或有更好的优化方法,可以: 提issue给我 或是pull requests 我都会看到并处理,欢迎Star. 这世界上总存在着那么一些看似相似但 ...

  5. 各种排序算法(JS实现)

    目录: 直接插入排序.希尔排序.简单选择排序.堆排序.冒泡排序.快速排序,归并排序.桶排序.基数排序.多关键字排序.总结 JS测试代码 function genArr(){ let n = Math. ...

  6. 几个排序算法的JS实现

    最近找工作,复习一下数据结构的知识,看到排序这一块,顺便动手改了一下. 直接插入排序: 插入排序就是把数据分为有序区和无序区,遍历到的数据和有序区域的数据进行比较,找到要插入的位置,插入位置后的数据做 ...

  7. 几种经典排序算法的JS实现

    一.冒泡排序 function BubbleSort(array) { var length = array.length; for (var i = length - 1; i > 0; i- ...

  8. 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 ...

  9. JS写的排序算法演示

    看到网上有老外写的,就拿起自已之前完成的jmgraph画图组件也写了一个.想了解jmgraph的请移步:https://github.com/jiamao/jmgraph 当前演示请查看:http:/ ...

随机推荐

  1. Docker(十一)-Docker commit创建镜像

    创建镜像有很多方法,用户可以从 Docker Hub 获取已有镜像并更新,也可以利用本地文件系统创建一个. 修改已有的镜像 查看已有的镜像: $ sudo docker images REPOSITO ...

  2. php 中的 “!=”和“!==”

    !==是指绝对不等于,比如,$a = 2, $b=”2″   那么,$a!==$b成立,可是$a!=$b不成立:

  3. ssh中文乱码解决

    在终端执行命令:export LC_ALL=zh_CN.GB2312;export LANG=zh_CN.GB2312是最有效的.=======================1.不管用那种ssh客户 ...

  4. 还在手动给css加前缀?no!几种自动处理css前缀的方法简介

    原文首发于个人博客:还在手动给css加前缀?no!几种自动处理css前缀的方法简介 我们知道在写css的时候由于要兼容不同厂商浏览器,一些比较新的属性需要给它们添加厂商前缀来兼容.移动端还好,基本只要 ...

  5. LOJ#551 Matrix

    本地打表在线AC什么的最喜欢了. 题意 \(\rm Alice\)和\(\rm Bob\)在玩游戏,他们要给一个\(n\times n\)的矩阵打标记.初始时没有任何标记,每一轮\(\rm Bob\) ...

  6. Day23-Model操作和Form操作-转载

    参考出处: http://blog.csdn.net/fgf00/article/details/54614706 Model和Form以及ModelForm简介 Model操作: 创建数据库表结构 ...

  7. jq给单选框 radio添加或删除选中状态

    $("#div1 :radio").removeAttr("checked");//删除目标div下所有单选框的选中状态 $("#div1 :radi ...

  8. spring@Transactional的一点理解

    spring事务有7种传播行为,分别是: 1.PROPAGATION.REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置. 2.PROPAGAT ...

  9. C#生成和识别二维码

    用到外部一个DLL文件(ThoughtWorks.QRCode.dll),看效果 生成截图 识别截图 生成二维码后右键菜单可以保存二维码图片,然后可以到识别模式下进行识别,当然生成后可以用手机扫描识别 ...

  10. 基于 Express 搭建一个node项目 - 起步

    一,如何基于 Express 搭建一个node项目 什么是Express 借用官方的介绍,Express是一个基于Node.js平台的极简.灵活的web应用开发框架,它提供了一系列强大的特性,帮助你创 ...