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

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. 使用phantomjs进行无界面UI自动化测试

    PhantomJS(http://phantomjs.org/) 是一个基于WebKit的服务器端JavaScript API.它全面支持web而不需浏览器支持,其快速.原生支持各种Web标准:DOM ...

  2. Js单元测试工具 以及 粗浅的对我的快乐运算进行测试

    1. Karma的介绍 Karma是Testacular的新名字,在2012年google开源了Testacular,2013年Testacular改名为Karma.Karma是一个让人感到非常神秘的 ...

  3. Linux vi中查找字符内容的方法

      使用vi编辑器编辑长文件时,常常是头昏眼花,也找不到需要更改的内容. 这时,使用查找功能尤为重要. 方法如下: 1.命令模式下输入“/字符串”,例如“/Section 3”. 2.如果查找下一个, ...

  4. 【刷题】LOJ 2818 「eJOI2018」循环排序

    题目描述 本题译自 eJOI2018 Problem F「Cycle Sort」 给定一个长为 \(n\) 的数列 \(\{a_i\}\) ,你可以多次进行如下操作: 选定 \(k\) 个不同的下标 ...

  5. 李建20181029课时整理(NOIP考点)

    历年真题 数学题: 数论(exgcd 逆元,CRT,EXCRT,快速幂,线性筛 ,杜教筛)排列组合 概率期望(什么东西) C(n,m) = 逆元? 分解质因数? Ti(大质数的类似物)思考技巧分解质因 ...

  6. 前端学习 -- Css -- 文档流

    文档流 文档流处在网页的最底层,它表示的是一个页面中的位置, 我们所创建的元素默认都处在文档流中 元素在文档流中的特点 块元素 块元素在文档流中会独占一行,块元素会自上向下排列. 块元素在文档流中默认 ...

  7. Spring Boot整合MyBatis(使用Spring Tool Suite工具)

    1. 创建Spring Boot项目 通过Spring Tool Suite的Spring Starter Project对话框,其实是把项目生成的工作委托http://start.spring.io ...

  8. 解题:NOI 2010 超级钢琴

    题面 WC时候写的题,补一下 做法比较巧妙:记录每个位置和它当前对应区间的左右端点,做前缀和之后重载一下小于号,用优先队列+ST表维护当前最大值.这样贡献就是区间最大值和端点左边差分一下,可以O(1) ...

  9. exgcd模板

    逆元模板P1082 #include <cstdio> #include <algorithm> int exgcd(int a, int b, int &x, int ...

  10. word绘图画布

    这样图形组合不会随着位置的变动而出现相对变化