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

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. [转帖]Mysql 最简单的参数调优配置

    http://blog.jobbole.com/113659/ 我并不期望成为一个专家级的 DBA,但是,在我优化 MySQL 时,我推崇 80/20 原则,明确说就是通过简单的调整一些配置,你可以压 ...

  2. [百家号]华为:最强ARM服务器芯片,华为鲲鹏920处理器发布

    华为:最强ARM服务器芯片,华为鲲鹏920处理器发布   泡泡网 百家号2019-01-0716:11 https://baijiahao.baidu.com/s?id=162198839753232 ...

  3. PHP开发APP接口实现--基本篇

    最近一段时间一直在做APP接口,总结一下APP接口开发以来的心得,与大家分享: 1. 客户端/服务器接口请求流程: 安卓/IOS客户端   –> PHP接口 –> 服务器端  –> ...

  4. Torch,Tensorflow使用: Ubuntu14.04(x64)+ CUDA8.0 安装 Torch和Tensorflow

    系统配置: Ubuntu14.04(x64) CUDA8.0 cudnn-8.0-linux-x64-v5.1.tgz(Tensorflow依赖) Anaconda 1. Torch安装 Torch是 ...

  5. 实战基于Spring Boot 2的WebFlux和mLab搭建反应式Web

    Spring Framework 5带来了新的Reactive Stack非阻塞式Web框架:Spring WebFlux.作为与Spring MVC并行使用的Web框架,Spring WebFlux ...

  6. [代码]--其他信息: ORA-01400: 无法将 NULL 插入

    这个错误其实就是oracle数据库的某列约束为 not null,但在插入值的时候插入了控制,无论是null和"",它都识别为空 有两种方法: 1.修改数据库字段约束为允许为空 2 ...

  7. 使用VBA批量转换Excel格式,由.xls转换成.xlsx

    问题分析: Excel2007以前的格式是.xls,之后的格式是.xlsx.打开单独的一个Excel文档,使用“另存为”功能,可以很轻松的转换格式.但是面对几百个Excel表这样就太累了,搜索很久,也 ...

  8. Emacs_快捷键列表

    Emacs_快捷键列表 emacs -nw 以终端模式运行emacsLC_CTYPE=zh_CN.UTF-8 emacs C = Control M = Meta = Alt | EscAlt 可以粘 ...

  9. 5月14日 绿城育华NOIP巨石杯试卷解析

    [题外话] 感谢UBUNTU为保存程序做出贡献:https://paste.ubuntu.com : 感谢洛谷OJ的私人题库保存题面:https://www.luogu.org : 现在我的题解的所有 ...

  10. Spark记录-Spark On YARN内存分配(转载)

    Spark On YARN内存分配(转载) 说明 按照Spark应用程序中的driver分布方式不同,Spark on YARN有两种模式: yarn-client模式.yarn-cluster模式. ...