1. /*
  2. 快速排序
  3.  
  4. 1.1 算法描述
  5. 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用。快速排序是一种既不浪费空间又可以快一点的排序算法。
  6.  
  7. 1.2 算法步骤
  8. 先从数列中取出一个数作为“基准”。
  9. 分区过程:将比这个“基准”大的数全放到“基准”的右边,小于或等于“基准”的数全放到“基准”的左边。
  10. 再对左右区间重复第二步,直到各区间只有一个数。
  11. */
  12. var quickSort = function (arr) {
  13. if (arr.length <= 1) { return arr; }
  14. var pivotIndex = Math.floor(arr.length / 2); //基准位置(理论上可任意选取)
  15. var pivot = arr.splice(pivotIndex, 1)[0]; //基准数
  16. var left = [];
  17. var right = [];
  18. for (var i = 0; i < arr.length; i++) {
  19. if (arr[i] < pivot) {
  20. left.push(arr[i]);
  21. } else {
  22. right.push(arr[i]);
  23. }
  24. }
  25. return quickSort(left).concat([pivot], quickSort(right)); //链接左数组、基准数构成的数组、右数组
  26. };
  27. // quickSort([1,3,1,2,1,77,3,55,44,66,22,4,1,56,88]);
  28.  
  29. /*
  30. 希尔排序
  31.  
  32. 1.1 算法描述
  33. 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。
  34. 希尔排序是基于插入排序的以下两点性质而提出改进方法的:
  35.  
  36. 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;
  37. 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位;
  38. 希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行依次直接插入排序。
  39.  
  40. 1.2 算法步骤
  41. 选择一个增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1;
  42. 按增量序列个数 k,对序列进行 k 趟排序;
  43. 每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。仅增量因子为 1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。
  44. */
  45. function shellSort(arr) {
  46. var len = arr.length,
  47. temp,
  48. gap = 1;
  49. while(gap < len/3) { //动态定义间隔序列
  50. gap = gap*3+1;
  51. }
  52. for (gap; gap > 0; gap = Math.floor(gap/3)) {
  53. for (var i = gap; i < len; i++) {
  54. temp = arr[i];
  55. for (var j = i-gap; j >= 0 && arr[j] > temp; j -= gap) {
  56. arr[j+gap] = arr[j];
  57. }
  58. arr[j+gap] = temp;
  59. }
  60. }
  61. return arr;
  62. }
  63.  
  64. /*
  65. 归并排序
  66.  
  67. 1.1 算法描述
  68. 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个典型的应用。
  69. 合并排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。
  70. 然后再把有序子序列合并为整体有序序列。 将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
  71. 若将两个有序表合并成一个有序表,称为2-路归并。
  72.  
  73. */
  74. function merge(leftArr, rightArr){
  75. var result = [];
  76. while (leftArr.length > 0 && rightArr.length > 0){
  77. if (leftArr[0] < rightArr[0])
  78. result.push(leftArr.shift()); //把最小的最先取出,放到结果集中
  79. else
  80. result.push(rightArr.shift());
  81. }
  82. return result.concat(leftArr).concat(rightArr); //剩下的就是合并,这样就排好序了
  83. }
  84.  
  85. function mergeSort(array){
  86. if (array.length == 1) return array;
  87. var middle = Math.floor(array.length / 2); //求出中点
  88. var left = array.slice(0, middle); //分割数组
  89. var right = array.slice(middle);
  90. return merge(mergeSort(left), mergeSort(right)); //递归合并与排序
  91. }
  92.  
  93. var arr = mergeSort([32,12,56,78,76,45,36]);
  94. console.log(arr); // [12, 32, 36, 45, 56, 76, 78]
  95.  
  96. /*
  97. 选择排序 类似于冒泡排序
  98.  
  99. 1.1 算法描述
  100. 选择排序是一种简单直观的排序算法,无论什么数据进去都是O(n2) 的时间复杂度。所以用到它的时候,数据规模越小越好。
  101. 唯一的好处可能就是不占用额外的内存空间了吧。
  102. 通俗来说就是你们中间谁最小谁就出列,站到队列的最后边,然后继续对着剩余的无序数组说你们中间谁最小谁就出列,
  103. 站到队列的最后边,一直到最后一个,继续站到最后边,这样数组就有了顺序,从小到大。
  104.  
  105. 1.2 算法步骤
  106. 在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
  107. 从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
  108. 重复第二步,直到所有元素均排序完毕。
  109. */
  110. function selectionSort(arr) {
  111. var len = arr.length;
  112. var minIndex, temp;
  113. for (var i = 0; i < len - 1; i++) {
  114. minIndex = i;
  115. for (var j = i + 1; j < len; j++) {
  116. if (arr[j] < arr[minIndex]) { // 寻找最小的数
  117. minIndex = j; // 将最小数的索引保存
  118. }
  119. }
  120. temp = arr[i];
  121. arr[i] = arr[minIndex];
  122. arr[minIndex] = temp;
  123. }
  124. return arr;
  125. }

JS快速排序 希尔排序 归并排序 选择排序的更多相关文章

  1. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

  2. Java 快速排序法 冒泡排序法 选择排序法 插入排序法

    1.快速排序的原理: 选择一个关键值作为基准值.比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的). 从后往前比较,用基准值和最后一个值比较,如果比基准值小的交换位置,如果 ...

  3. 使用 js 实现十大排序算法: 选择排序

    使用 js 实现十大排序算法: 选择排序 选择排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  4. 数据结构和算法(Golang实现)(20)排序算法-选择排序

    选择排序 选择排序,一般我们指的是简单选择排序,也可以叫直接选择排序,它不像冒泡排序一样相邻地交换元素,而是通过选择最小的元素,每轮迭代只需交换一次.虽然交换次数比冒泡少很多,但效率和冒泡排序一样的糟 ...

  5. 选择排序—简单选择排序(Simple Selection Sort)

    基本思想: 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素 ...

  6. 排序算法--选择排序(Selection Sort)_C#程序实现

    排序算法--选择排序(Selection Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来 ...

  7. 排序(Sort)-----选择排序

       声明:文中动画转载自https://blog.csdn.net/qq_34374664/article/details/79545940    1.选择排序简介 选择排序(Select Sort ...

  8. 选择排序—简单选择排序(Simple Selection Sort)原理以及Java实现

    基本思想: 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素 ...

  9. 9, java数据结构和算法: 直接插入排序, 希尔排序, 简单选择排序, 堆排序, 冒泡排序,快速排序, 归并排序, 基数排序的分析和代码实现

    内部排序: 就是使用内存空间来排序 外部排序: 就是数据量很大,需要借助外部存储(文件)来排序. 直接上代码: package com.lvcai; public class Sort { publi ...

随机推荐

  1. C#从SqlServer数据库读写文件源码

    如下的资料是关于C#从SqlServer数据库读写文件的内容,希望能对码农们有一些用. <%@ Page Language="C#" %> <script run ...

  2. JVM内存管理 《深入分析java web 技术内幕》第八章

    8.1 物理内存与虚拟内存 物理内存RAM(随机存储器),寄存单元为寄存器,用于存储计算单元执行指令的中间结果. 连接处理器和RAM或者处理器和寄存器的是地址总线,这个地址的宽度影响了物理地址的索引范 ...

  3. c/c++ gdb 调试带参数的程序

    直接gdb pgname 参数1 这种方式,参数1是不会带到gdb里的 1,首先启动程序 gdb pgname 2,设置程序的参数 set args 参数1

  4. Asp.Net Core 实现谷歌翻译ApI 免费版

    由于谷歌翻译官方API是付费版本,本着免费和开源的精神.分享一下用 Net Core 实现谷歌翻译API的代码. 项目引用的Nuget 包: ChakraCore.NET Newtonsoft.Jso ...

  5. daily english dictation 学习笔记[1-10]

    b站网址https://www.bilibili.com/video/av17188299/?p=2 1. Mother Teresa, who received a Nobel Peace Priz ...

  6. 【Linux基础】Unix与Linux操作系统介绍

    一.Unix和Linux操作系统概述 1.Unix是什么 UNIX是一个计算机操作系统,一个用来协调.管理和控制计算机硬件和软件资源的控制程序. 2.Unix特点 (1)多用户:在同一时刻可以有多个用 ...

  7. 一次CMS GC问题排查过程(理解原理+读懂GC日志)

    这个是之前处理过的一个线上问题,处理过程断断续续,经历了两周多的时间,中间各种尝试,总结如下.这篇文章分三部分: 1.问题的场景和处理过程:2.GC的一些理论东西:3.看懂GC的日志 先说一下问题吧 ...

  8. vue2.0 :style :class样式设置

    HTML :style 的用法 <el-dialog custom-class="creatUser-wrap" :style="{display:formShow ...

  9. java 项目打jar包,用cmd运行,并且编写运行脚本

    项目是ideal编辑器的springboot项目的demo.打包就是在侧边栏,点击packge ,就会在target下生成jar包. 生成之后把 jar包放在一个文件夹中.新建一个txt文件,在txt ...

  10. python之面相对象程序设计

    一 面向对象的程序设计的由来 面向对象设计的由来见概述:http://www.cnblogs.com/linhaifeng/articles/6428835.html 面向对象的程序设计:路飞学院版 ...