---恢复内容开始---

一,冒泡排序。

  具体算法描述如下:

    <1>.比较相邻的元素。如果第一个比第二个大,就交换它们两个;

    <2>.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;

    <3>.针对所有的元素重复以上的步骤,除了最后一个;

    <4>.重复步骤1~3,直到排序完成。

  代码实现

let arr = [9, 10, 8, 7, 5, 4, 2, 1, 3, 6];

      function sort(arr) {
var as = [].concat(arr), len = arr.length, count = 0;
for (let i = 0; i < len-1; i++) {
for (let j = 0; j < len-1-i; j++) {
if(as[j]>as[j+1]){
var item = as[j];
as[j] = as[j+1];
as[j+1] = item;
count++;
}
}
}
console.log(count)
return as
}
console.log(sort(arr))

结果:

count:37
arr:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

二,选择排序。

  描述:

    在时间复杂度上表现最稳定的排序算法之一,因为无论什么数据进去都是O(n²)的时间复杂度。。。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。

  实现:

let arr = [9, 10, 8, 7, 5, 4, 2, 1, 3, 6];

      function sort(arr) {
var as = [].concat(arr), len = arr.length, count = 0, minNum, item;
for (let i = 0; i < len-1; i++) {
minNum = i;
for (let j = i+1; j < len; j++) {
if(as[minNum] > as[j]){
minNum = j;
count++
}
}
item = as[i];
as[i] = as[minNum];
as[minNum] = item;
}
console.log(count)
return as
}
console.log(sort(arr))

三,插入排序。

  描述:插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

  实现:

let arr = [9, 10, 8, 7, 5, 4, 2, 1, 3, 6];

      function sort(arr) {
var as = [].concat(arr), len = arr.length, count = 0, preIndex, item;
for (let i = 1; i < len; i++) {
preIndex = i-1;
item = as[i];
while(preIndex >= 0 && as[preIndex] > item){
as[preIndex+1] = as[preIndex]
preIndex-- ;
count++;
}
as[preIndex+1] = item
}
console.log(count)
return as
}
console.log(sort(arr))

四,希尔排序。

  描述:希尔排序本质上是一种插入排序,但是对数列进行了等间隔分组处理,在每一组中做插入排序,这一优化使得原本 O(n^2) 的时间复杂度一下降为 O(nlogn)

  实现:

let arr = [9, 10, 8, 7, 5, 4, 2, 1, 3, 6];
function shellsort(arr) {
for (let gap = Math.floor(arr.length/2); gap > 0; gap = Math.floor(gap/2)) {
for (let i = gap; i < arr.length; i++) {
let item = arr[i];
let j = i-1;
while (j>=0 && arr[j] > item) {
arr[j+1] = arr[j];
j--;
}
arr[j+1] = item; }
}
}
console.log(shellsort(arr));

五,归并排序。

        let arr = [9, 10, 8, 7, 5, 4, 2, 1, 3, 6];
function mergeSort(arr) {
if (arr.length<2) {
return arr
}
let middle =parseInt(arr.length/2);
let left = arr.slice(0,middle);
let right = arr.slice(middle);
if(left.length =='undefined' && right.length == 'undefined'){
return false
}
return merge(mergeSort(left),mergeSort(right))
} function merge(left,right) {
let result= []; while (left.length && right.length) {
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())
}
return result
}
console.log(mergeSort(arr));

六,快速排序。

 let arr = [9, 10, 8, 7, 5, 4, 2, 1, 3, 6];
function quickSort(arr) {
if(arr.length<=1){
return arr
}
let middle = Math.floor(arr.length/2);
let povid = arr.splice(middle,1)[0];
let left = [];
let right = [];
for (let i = 0; i < arr.length; i++) {
if(arr[i] < povid){
left.push(arr[i])
}else {
right.push(arr[i])
}
}
return quickSort(left).concat([povid],quickSort(right))
}
console.log(quickSort(arr))

七,堆排序。

//调整函数
function headAdjust(elements, pos, len){
//将当前节点值进行保存
var swap = elements[pos]; //定位到当前节点的左边的子节点
var child = pos * 2 + 1; //递归,直至没有子节点为止
while(child < len){
//如果当前节点有右边的子节点,并且右子节点较大的场合,采用右子节点
//和当前节点进行比较
if(child + 1 < len && elements[child] < elements[child + 1]){
child += 1;
} //比较当前节点和最大的子节点,小于则进行值交换,交换后将当前节点定位
//于子节点上
if(elements[pos] < elements[child]){
elements[pos] = elements[child];
pos = child;
child = pos * 2 + 1;
}
else{
break;
} elements[pos] = swap;
}
} //构建堆
function buildHeap(elements){
//从最后一个拥有子节点的节点开始,将该节点连同其子节点进行比较,
//将最大的数交换与该节点,交换后,再依次向前节点进行相同交换处理,
//直至构建出大顶堆(升序为大顶,降序为小顶)
for(var i=elements.length/2; i>=0; i--){
headAdjust(elements, i, elements.length);
}
} function sort(elements){
//构建堆
buildHeap(elements); //从数列的尾部开始进行调整
for(var i=elements.length-1; i>0; i--){
//堆顶永远是最大元素,故,将堆顶和尾部元素交换,将
//最大元素保存于尾部,并且不参与后面的调整
var swap = elements[i];
elements[i] = elements[0];
elements[0] = swap; //进行调整,将最大)元素调整至堆顶
headAdjust(elements, 0, i);
}
} var elements = [3, 1, 5, 7, 2, 4, 9, 6, 10, 8]; sort(elements);
console.log(elements);

八,计数排序。

       function countingSort(array) {
let len = array.length,B = [],C = [],min = array[0], max = array[0];
  for (var i = 0; i < len; i++) {
    min = min <= array[i] ? min : array[i];
    max = max >= array[i] ? max : array[i];
    C[array[i]] = C[array[i]] ? C[array[i]] + 1 : 1;
  }   // 计算排序后的元素下标
  for (var j = min; j < max; j++) {
    C[j + 1] = (C[j + 1] || 0) + (C[j] || 0);
  }
  for (var k = len - 1; k >= 0; k--) {
    B[C[array[k]] - 1] = array[k];
    C[array[k]]--;
  }
  return B;
}
var elements = [3, 1, 5, 7, 2, 4, 9, 6, 10, 8]; console.log(countingSort(elements));

九,桶排序。

//  @param array 数组
// @param num 桶的数量
function bucketSort(array, num) {
  if (array.length <= 1) {
    return array;
  }
  var len = array.length, buckets = [], result = [], min =array[0], max =array[0] , space, n = 0;   var index = Math.floor(len / num) ;
  while(index<2){     num--;
    index = Math.floor(len / num) ;
  }   for (var i = 1; i < len; i++) {
    min = min <= array[i] ? min : array[i];
    max = max >= array[i] ? max : array[i];
  }
  space = (max - min + 1) / num; //步长
  for (var j = 0; j < len; j++) {
    var index = Math.floor((array[j] - min) / space);
    if (buckets[index]) { // 非空桶,插入排序
      var k = buckets[index].length - 1;
      while (k >= 0 && buckets[index][k] > array[j]) {
        buckets[index][k + 1] = buckets[index][k];
        k--;
      }
      buckets[index][k + 1] = array[j];
    } else { //空桶,初始化
      buckets[index] = [];
      buckets[index].push(array[j]);
    }
  }
  while (n < num) {
    result = result.concat(buckets[n]);
    n++;
  }
  return result;
}
var elements = [3, 1, 5, 7, 2, 4, 9, 6, 10, 8]; console.log(bucketSort(elements,4));

十,基数排序。

/**
* 基数排序适用于:
* (1)数据范围较小,建议在小于1000
* (2)每个数值都要大于等于0
* @author damonare
* @param arr 待排序数组
* @param maxDigit 最大位数
*/
//LSD Radix Sort function radixSort(arr, maxDigit) {
  var mod = 10;
  var dev = 1;
  var counter = [];
  console.time('基数排序耗时');
  for (var i = 0; i < maxDigit; i++, dev *= 10, mod *= 10) {
    for(var j = 0; j < arr.length; j++) {
      var bucket = parseInt((arr[j] % mod) / dev);
      if(counter[bucket]== null) {
        counter[bucket] = [];
      }
    counter[bucket].push(arr[j]);
    }
    var pos = 0;
    for(var j = 0; j < counter.length; j++) {
      var value = null;
      if(counter[j]!=null) {
        while ((value = counter[j].shift()) != null) {
          arr[pos++] = value;
        }
      }
    }
  }
  console.timeEnd('基数排序耗时');
  return arr;
}
var elements = [3, 1, 5, 7, 2, 4, 9, 6, 10, 8]; console.log(radixSort(elements,2));

回温js算法的更多相关文章

  1. Java判断回文数算法简单实现

    好久没写java的代码了, 今天闲来无事写段java的代码,算是为新的一年磨磨刀,开个头,算法是Java判断回文数算法简单实现,基本思想是利用字符串对应位置比较,如果所有可能位置都满足要求,则输入的是 ...

  2. DLoopDetector回环检测算法

    词袋模型是一种文本表征方法,它应用到计算机视觉领域就称之为BoF(bag of features),通过BoF可以把一张图片表示成一个向量.DBoW2是一个视觉词袋库,它提供了生成和使用词典的接口,但 ...

  3. js算法集合(一) 水仙花数 及拓展(自幂数的判断)

    js算法集合(一) ★ 最近有些朋友跟我说对js中的一些算法感到很迷惑,知道这个算法到底是怎么回事,但是就是不会用代码把它写出来,这里我跟大家分享一下做水仙花数的算法的思路,并对其扩展到自幂数的算法, ...

  4. js算法集合(二) javascript实现斐波那契数列 (兔子数列)

    js算法集合(二)  斐波那契数列 ★ 上一次我跟大家分享一下做水仙花数的算法的思路,并对其扩展到自幂数的算法,这次,我们来对斐波那契数列进行研究,来加深对循环的理解.     Javascript实 ...

  5. js算法初窥03(简单搜索及去重算法)

    前面我们了解了一些常用的排序算法,那么这篇文章我们来看看搜索算法的一些简单实现,我们先来介绍一个我们在实际工作中一定用到过的搜索算法--顺序搜索. 1.顺序搜索 其实顺序搜索十分简单,我们还是以第一篇 ...

  6. JS算法练习四

    JS算法练习 1.将使用空格分隔单词使用驼峰命名连接起来: var str="HELLO world welcome to my hometown"; /*--先输入一个有空格分隔 ...

  7. JS算法练习三

    JS算法练习 1.生成一个长度为10的随机数组,使用冒泡法给数组排序 var arr=new Array(10); for (var i = 0; i <arr.length ; i++) { ...

  8. JS算法练习二

    JS算法练习 1.生成4位的随机验证码,可取大小写字母和数字 ? var validateCode = "", /*--存放生成好的验证码字符串--*/ count = 0; /* ...

  9. JS算法练习一

    JS算法练习 1.随机生成一个五位以内的数,然后输出该数共有多少位,每位分别是什么? ①.数组添加元素的方式得到位数(数组长度)与值(数组元素) ①.数组添加元素的方式得到位数(数组长度)与值(数组元 ...

随机推荐

  1. 【ASP.NET Core快速入门】(三)准备CentOS和Nginx环境

    基本软件 VMware虚拟机 centos:http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-170 ...

  2. 并发系列(5)之 Future 框架详解

    本文将主要讲解 J.U.C 中的 Future 框架,并分析结合源码分析其内部结构逻辑: 一.Future 框架概述 JDK 中的 Future 框架实际就是 Future 模式的实现,通常情况下我们 ...

  3. JavaScript键盘鼠标事件处理

    监听键盘鼠标事件 监听某个按键事件 当键盘上的某个键被按下时,会依次触发一次下面的事件: onkeydown: 键盘按下这个动作(按下键盘) onkeypress: 键盘被按住(一直按着键盘不动) o ...

  4. SLAM+语音机器人DIY系列:(二)ROS入门——9.熟练使用rviz

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

  5. AspNetCore中使用Ocelot之 IdentityServer4(1)

    AspNetCore中使用Ocelot之 IdentityServer4(1) 前言: OceLot网关是基于AspNetCore 产生的可扩展的高性能的企业级Api网关,目前已经基于2.0 升级版本 ...

  6. .net 多线程 Thread ThreadPool Task

    先准备一个耗时方法 /// <summary>/// 耗时方法/// </summary>/// <param name="name">< ...

  7. .net工具类 获取枚举类型的描述

    一般情况我们会用枚举类型来存储一些状态信息,而这些信息有时候需要在前端展示,所以需要展示中文注释描述. 为了方便获取这些信息,就封装了一个枚举扩展类. /// <summary> /// ...

  8. ubuntu server 16.04 开启root密码登录

    0x00 ubuntu server 16.04 开启root密码登录 由于众多VPS默认使用证书验证登录,虽然安全但使用十分不便,所以特提供开启root用户并使用密码登录方法. 0x01 为root ...

  9. 小米平板6.0系统如何无ROOT激活xposed框架的步骤

    在较多企业的引流,或业务操作中,基本上都需要使用安卓的黑高科技术Xposed框架,近期,我们企业购买了一批新的小米平板6.0系统,基本上都都是基于7.0以上系统,基本上都不能够获得ROOT的su权限, ...

  10. 开始食用grpc(之二)

    开始食用grpc(之二) 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9570992.html ``` 前段时间有童鞋找我开专栏.搬家.甚至还有人找我写书的. ...