排序算法的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:/ ...
随机推荐
- kubectl 命令记录 转帖自: https://www.kubernetes.org.cn/doc-45
kubectl annotate – 更新资源的注解. kubectl api-versions – 以“组/版本”的格式输出服务端支持的API版本. kubectl apply – 通过文件名或控制 ...
- 【转】mybatis如何防止sql注入
sql注入大家都不陌生,是一种常见的攻击方式,攻击者在界面的表单信息或url上输入一些奇怪的sql片段,例如“or ‘1’=’1’”这样的语句,有可能入侵参数校验不足的应用程序.所以在我们的应用中需要 ...
- BZOJ2303 APIO2011方格染色(并查集)
比较难想到的是将题目中的要求看做异或.那么有ai,j^ai+1,j^ai,j+1^ai+1,j+1=1.瞎化一化可以大胆猜想得到a1,1^a1,j^ai,1^ai,j=(i-1)*(j-1)& ...
- P3114 [USACO15JAN]踩踏Stampede
题目链接 我一开始看错题了,看成每秒走\(c_i\)个单位了,于是样例答案就变成了3..害我调好久,还以为样例错了 对于每头奶牛,我们求出它经过\(y\)轴的时间段,然后离散化一下,将奶牛按照从低到高 ...
- The Super Powers UVA - 11752(合数幂)
题意: 求1~2^64-1之间所有的 至少是两个不同的正整数的幂的数 升序输出 一个数的合数次幂即为这样的数 找出1~2^64-1中所有数的合数次幂 用set存起来(既能防止重复 又能升序) 最后输 ...
- Day25-博客系统
1. 搭建环境请参考:http://www.cnblogs.com/momo8238/p/7508677.html 2.创建3张表备用 models.py from django.db import ...
- 【题解】 luogu 3857 [TJOI2008]彩灯 (线性基)
luogu3857,懒得复制 Solution: 裸的线性基,往里面添加数,记录添加个数\(sum\),快速幂输出\(2^{sum}\)即可 Code: //It is coded by Ning_M ...
- 自学huawei之路-AC6005-8AP添加授权码
返回自学Huawei之路 自学huawei之路-AC6005-8AP添加授权码
- bzoj1040 骑士
Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火 ...
- 解题:SPOJ 422 Transposing is Even More Fun
题面 这种换来换去的东西很容易想到置换群那一套,然后题目甚至还暗示了二进制=.= 直接换的话显然是$2^{a+b}$次,但是一个循环节里可以少换一次,然后问题就变成了数循环节 在一个循环节里的位置有什 ...