冒泡排序

比较任何两个相邻的项,如果第一个比第二个大,则交换它们

重复这样的操作,直到排序完成,具体代码如下:

  1. let arr = [67,23,11,89,45,76,56,99]
  2. function bubbleSort ( data ) {
  3. var temp = 0;
  4. for ( var i = data.length ; i > 0 ; i -- ){
  5. for( var j = 0 ; j < i - 1 ; j++){
  6. if( data[j] > data[j + 1] ){
  7. temp = data[j];
  8. data[j] = data [j+1];
  9. data[j+1] = temp;
  10. }
  11. }
  12. }
  13. return data;
  14. }
  15. console.log(bubbleSort(arr))

选择排序

找到数据结构中的最小值并 将其放置在第一位,接着找到第二小的值并将其放在第二位,以此类推。具体代码如下:

  1. let arr = [67,23,11,89,45,76,56,99]
  2. function selectionSort (data) {
  3. let indexMin
  4. for (let i = 0; i < data.length - 1; i++){
  5. indexMin = i
  6. for (var j = i; j < data.length; j++){
  7. if(data[indexMin] > data[j]) {
  8. indexMin = j
  9. }
  10. }
  11. if (i !== indexMin){
  12. let aux = data[i]
  13. data[i] = data[indexMin]
  14. data[indexMin] = aux
  15. }
  16. }
  17. return data
  18. }
  19. console.log(selectionSort(arr))

插入排序

依次循环每个数组元素,对比当前数组元素在已经排好的数组元素中处于什么位置,并插入。具体代码如下:

  1. let arr = [67,23,11,89,45,76,56,99]
  2. function insertionSort( data ) {
  3. var len = data.length;
  4. for (var i = 1; i < len; i++) {
  5. var key = data[i];
  6. var j = i - 1;
  7. while ( j >= 0 && data[j] > key) {
  8. data[j + 1] = data[j];
  9. j--;
  10. }
  11. data[j + 1] = key;
  12. }
  13. return data;
  14. }
  15. console.log(insertionSort(arr))

归并排序

把数组从中间拆分成左右两部分,然后把左右两部分再拆分,直到拆分的数组中只有一个元素。

拆分完后再将拆分的数组依次合并成有序数组,合并到最后会变成左右两个有序数组的合并。具体代码如下

  1. const merge = (left, right) => {
  2. const result = []
  3. let il = 0
  4. let ir = 0
  5. while(il < left.length && ir < right.length) {
  6. if(left[il] < right[ir]) {
  7. result.push(left[il++]) // 这里的left[il++]是先进行取值运算left[il], 在进行自增运算il++
  8. } else {
  9. result.push(right[ir++])
  10. }
  11. }
  12. while (il < left.length) {
  13. result.push(left[il++])
  14. }
  15. while (ir < right.length) {
  16. result.push(right[ir++])
  17. }
  18. return result
  19. }
  20. const mergeSortRec = array => {
  21. if (array.length === 1) {
  22. return array
  23. }
  24. const mid = Math.floor(array.length / 2)
  25. const left = array.slice(0, mid)
  26. const right = array.slice(mid, array.length)
  27. return merge(mergeSortRec(left), mergeSortRec(right))
  28. }
  29.  
  30. let arr = [5, 3, 2, 4, 1]
  31. console.log(mergeSortRec(arr))

快速排序

在数组中选择一个基准值,所有小于基准的都放在左边,大于基准的都放在右边,再把左右两个数组同样处理,直到数组中只有一个元素为止

再依次合并排序完的所有数组,就得到了有序的数组,代码如下:

  1. let arr = [67,23,11,89,45,76,56,99]
  2. let quickSort = function(arr) {
  3.  
  4. if (arr.length <= 1) { return arr }
  5.  
  6. let pivot = arr.shift()
  7. let left = []
  8. let right = []
  9.  
  10. for (var i = 0; i < arr.length; i++){
  11. if (arr[i] < pivot) {
  12. left.push(arr[i])
  13. } else {
  14. right.push(arr[i])
  15. }
  16. console.log(left, right, 'aaa')
  17. }
  18.  
  19. return quickSort(left).concat([pivot], quickSort(right))
  20.  
  21. }
  22. console.log(quickSort(arr))

js学习笔记之排序算法的原理及代码的更多相关文章

  1. STL学习笔记(排序算法)

    STL提供了好几种算法对区间内的元素排序.出来完全排序外,还支持局部排序. 对所有元素排序 void sort(RandomAccessIterator beg,RandomAccessIterato ...

  2. TSPL学习笔记(3):排序算法练习

    快速排序 快排的详细介绍见,简单的说就是取输入序列中的首元素m,然后将除首元素m以外的其它元素分成两组,小于等于m的一组和大于m的一组.将3组元素组合成输入队列:小于等于m + m + 大于m. 下面 ...

  3. 【转】Backbone.js学习笔记(二)细说MVC

    文章转自: http://segmentfault.com/a/1190000002666658 对于初学backbone.js的同学可以先参考我这篇文章:Backbone.js学习笔记(一) Bac ...

  4. 2019-4-29 js学习笔记

    js学习笔记一:js数据类型   1:基本数据类型       number类型(整数,小数)      String类型          boolean类型        NaN类型其实是一个nu ...

  5. 一点感悟:《Node.js学习笔记》star数突破1000+

    写作背景 笔者前年开始撰写的<Node.js学习笔记> github star 数突破了1000,算是个里程碑吧. 从第一次提交(2016.11.03)到现在,1年半过去了.突然有些感慨, ...

  6. Java基础复习笔记基本排序算法

    Java基础复习笔记基本排序算法 1. 排序 排序是一个历来都是很多算法家热衷的领域,到现在还有很多数学家兼计算机专家还在研究.而排序是计算机程序开发中常用的一种操作.为何需要排序呢.我们在所有的系统 ...

  7. WebGL three.js学习笔记 6种类型的纹理介绍及应用

    WebGL three.js学习笔记 6种类型的纹理介绍及应用 本文所使用到的demo演示: 高光贴图Demo演示 反光效果Demo演示(因为是加载的模型,所以速度会慢) (一)普通纹理 计算机图形学 ...

  8. ZooKeeper学习笔记(二)——内部原理

    zookeeper学习笔记(二)--内部原理 1. zookeeper的节点的类型 总的来说可以分为持久型和短暂型,主要区别如下: 持久:客户端与服务器端断开连接的以后,创建的节点不会被删除: 持久化 ...

  9. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

随机推荐

  1. Java @SuppressWarnings:抑制编译器警告-4

    Java 中的 @SuppressWarnings 注解指示被该注解修饰的程序元素(以及该程序元素中的所有子元素)取消显示指定的编译器警告,且会一直作用于该程序元素的所有子元素.例如,使用 @Supp ...

  2. Map集合中的方法

    Map集合中的方法: values() 方法 : 获取集合中的所有的值----没有键,没有对应关系, KeySet() 方法: 将Map中所有的键存入到set集合中.因为set具备迭代器.所有可以迭代 ...

  3. Kubernetes使用节点污点和pod容忍度阻止节点调度到特定节点

    Kubernetes允许你去影响pod被调度到哪个节点.起初,只能通过在pod规范里指定节点选择器来实现,后面其他的机制逐渐加入来扩容这项功能,本章将包括这些内容. 现在要介绍的高级调度的两个特性是节 ...

  4. 流程自动化RPA,Power Automate Desktop系列 - 批量备份Git仓库做好灾备

    一.背景 打个比如,你在Github上的代码库需要批量的定时备案到本地的Gitlab上,以便Github不能访问时,可以继续编写,这时候我们可以基于Power Automate Desktop来实现一 ...

  5. 自定义组件开发:使用v-model封装el-pagination组件

    1.前言 通过封装el-pagination组件开发自定义分页组件的类似文章网上已经有很多了,但看了一圈,总是不如意,于是决定还是自己动手搞一个. 2.背景 2.1.常规分页处理方法 利用el-pag ...

  6. 在windows的情况下面右键添加vim

    1, 首先打开注册表,然后打开下面路径: HKEY_CLASSES_ROOT\*\Shell 2, 右键新建项(也就是右键的文字):  用vim编辑 3, 在"用vim编辑"下面再 ...

  7. docker安装和配置nginx

    配置nginx docker配置nginx 本机ip是192.168.0.200 docker pull nginx 配置nginx主机 vi /root/docker/nginx/nginx01.c ...

  8. [转载] 笑话:Developer and product manager

    A man flying in a hot air balloon suddenly realizes he's lost. He reduces height and spots a man dow ...

  9. windows服务器下MySQL配置字符集

    这俩天公司使用.netcore微服务+mysql做项目,mysql在使用的时候总是出现一些字符集的问题,修改utf8或utf8mb4后mysql的服务就启动不了,这里做下记录如果把my.ini中的字符 ...

  10. U149791 正多边形变换

    原博客网页--洛谷博客 题目地址 如果您对群论有所了解,那么本题就是对二面体群 \(D_{2n}\) 的简单实现,您可以直接跳到代码部分.下面的解题思路只是对二面体群 \(D_{2n}\) 的构造思路 ...