▓▓▓▓▓▓ 大致介绍

  由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序、快速排序、直接插入排序、希尔排序、直接选择排序

▓▓▓▓▓▓ 交换排序

  交换排序是一类在排序过程中借助于交换操作来完成排序的方法,基本思想是两两比较排序记录的关键字,如果发现两个关键字逆序,则将两个记录位置互换,重复此过程,直到该排序列中所有关键字都有序为止,接下来介绍交换排序中常见的冒泡排序快速排序

▓▓▓▓▓▓ 冒泡排序

  冒泡排序的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名

  冒泡排序算法的运作如下:(从后往前)
  1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。
    2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3、针对所有的元素重复以上的步骤,除了最后一个。
  4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

  冒泡排序的时间复杂度是 O(n^2)

  代码:

         // 冒泡排序
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 arrMax = arr[j+1];
arr[j+1] = arr[j];
arr[j] = arrMax;
}
}
} return arr;
}

▓▓▓▓▓▓ 快速排序 

  快速排序(Quicksort)是对冒泡排序的一种改进。
 
  快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数       据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
 
  一趟快速排序的算法是:
  1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
  2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
  3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;
  4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
  5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为              止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。
 
  快速排序的时间复杂度是O(n*logn)
 
  代码:

         // 快速排序
function quickSort(arr){
// 结束递归条件
if(arr.length <= 1){
return arr;
} var left = [];
var right = [];
var key = arr[0]; // 分组
for(var i=1;i<arr.length;i++){
if(arr[i] < key){
left.push(arr[i]);
}else{
right.push(arr[i]);
}
} // 递归分组
return quickSort(left).concat(key,quickSort(right));
}

▓▓▓▓▓▓ 插入排序

  插入排序的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排序的序列中的适当位置,直到全部记录插入完成为止,接下来介绍两种常用的插入排序方法:直接插入排序希尔排序

▓▓▓▓▓▓ 直接插入排序

  直接插入排序(straight insertion sort)的做法是:
  每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第         三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。
  
  直接插入排序的时间复杂度为
  
  代码:

         // 直接插入排序
function insertSort(arr){
// 默认第一个元素是有序的
for(var i=1;i<arr.length;i++){ if(arr[i] < arr[i-1]){
var guard = arr[i];
var j = i - 1;
// 将有序数组扩大一位
arr[i] = arr[j]; //遍历有序组,找到自己的位置
while(j >= 0 && guard < arr[j]){
arr[j+1] = arr[j];
j--;
} // 插入检查的元素
arr[j+1] = guard;
}
}
return arr;
}

▓▓▓▓▓▓ 希尔排序

  希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出      而得名。  

  希尔排序属于插入类排序,是将整个有序序列分割成若干小的子序列分别进行插入排序。
  排序过程:先取一个正整数d1<n,把所有序号相隔d1的数组元素放一组,组内进行直接插入排序;然后取d2<d1,重复上述分组和排序操作;直至di=1,即所有       记录放进一 个组中排序为止。
 
  希尔排序的时间复杂度为时间复杂度O(n*logn)
 
  代码:

         // 希尔排序
function shellSort(arr){
var len = arr.length;
var stepLen = 1;
// 确定首次遍历的步长
while(stepLen < len/3){
stepLen = 3*stepLen + 1;
}
// 开始遍历
while(stepLen >= 1){
for(var i=stepLen;i<len;i++){
for(var j=i;j>=stepLen && arr[j] < arr[j-stepLen];j-=stepLen){
swap(arr,j,j-stepLen);
}
}
stepLen = (stepLen - 1)/3;
} return arr;
} function swap(arr,i,j){
var temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}

▓▓▓▓▓▓ 选择排序

  选择排序的基本思想是:每一趟排序在n-i+1个带排序记录中选出关键字最小的记录,作为有序序列的第i个记录,直到全部记录排序完毕。常用的排序方法有直接选择排序堆排序(由于js不能很好的体现堆排序的特点就不写了)

  

▓▓▓▓▓▓ 直接选择排序

  基本思想是:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,....,第i次从R[i-1]~R[n-1]中选取最小值,与R[i-1]交换,.....,第n-1次从R[n-2]~R[n-1]中选取最小值,与R[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列

  直接选择排序的时间复杂度:O(n^2)

  代码:

         // 直接选择排序
function straightSelectSort(arr){
// 默认第一个元素是最小的
var min;
var k;
var lArr = [];
for(var i=0;i<arr.length-1;i++){
min = arr[i];
k = i;
for(var j=i+1;j<arr.length;j++){
if(arr[j] < min){
min = arr[j];
k = j;
}
}
if(k != i){
arr[k] = arr[i];
arr[i] = min;
}
}
return arr;
}

JavaScript实现常用的排序算法的更多相关文章

  1. 常用Java排序算法

    常用Java排序算法 冒泡排序 .选择排序.快速排序 package com.javaee.corejava; public class DataSort { public DataSort() { ...

  2. java SE 常用的排序算法

    java程序员会用到的经典排序算法实现 常用的排序算法(以下代码包含的)有以下五类: A.插入排序(直接插入排序.希尔排序) B.交换排序(冒泡排序.快速排序) C.选择排序(直接选择排序.堆排序) ...

  3. C#中常用的排序算法的时间复杂度和空间复杂度

    常用的排序算法的时间复杂度和空间复杂度   常用的排序算法的时间复杂度和空间复杂度 排序法 最差时间分析 平均时间复杂度 稳定度 空间复杂度 冒泡排序 O(n2) O(n2) 稳定 O(1) 快速排序 ...

  4. 数据结构中常用的排序算法 && 时间复杂度 && 空间复杂度

    第一部分:数据结构中常用的排序算法 数据结构中的排序算法一般包括冒泡排序.选择排序.插入排序.归并排序和 快速排序, 当然还有很多其他的排序方式,这里主要介绍这五种排序方式. 排序是数据结构中的主要内 ...

  5. 常用的排序算法介绍和在JAVA的实现(二)

    一.写随笔的原因:本文接上次的常用的排序算法介绍和在JAVA的实现(一) 二.具体的内容: 3.交换排序 交换排序:通过交换元素之间的位置来实现排序. 交换排序又可细分为:冒泡排序,快速排序 (1)冒 ...

  6. 记一下JavaScript的几种排序算法

    零.写在最前 排序的方法有很多种,这篇文章只是记录我熟悉的算法: 我发现了一个关于排序算法很有趣的网站,把相关的算法演示做成了动画,有兴趣的同学可以看看! 附上SortAnimate网站链接:http ...

  7. 排序总结---常用的排序算法总结,java和js实现

    这篇博客对几种常见的排序算法进行归纳总结,在接下来的博客中会依次给出每个排序算法的例子 [由于博客上面进行编辑不太方便,图表都是在电脑上编辑好,上传的图片] 1.排序的分类 2.几种内部排序方法的比较 ...

  8. JavaScript十大经典排序算法

    排序算法说明 (1)排序的定义:对一序列对象根据某个关键字进行排序: 输入:n个数:a1,a2,a3,…,an输出:n个数的排列:a1’,a2’,a3’,…,an’,使得a1’ 再讲的形象点就是排排坐 ...

  9. 常用的排序算法介绍和在JAVA的实现(一)

    一.写随笔的原因:排序比较常用,借此文介绍下排序常用的算法及实现,借此来MARK一下,方便以后的复习.(本人总是忘得比较快) 二.具体的内容: 1.插入排序 插入排序:在前面已经排好序的序列中找到合适 ...

随机推荐

  1. iOS代码规范(OC和Swift)

    下面说下iOS的代码规范问题,如果大家觉得还不错,可以直接用到项目中,有不同意见 可以在下面讨论下. 相信很多人工作中最烦的就是代码不规范,命名不规范,曾经见过一个VC里有3个按钮被命名为button ...

  2. html中如何添加提示信息

    提示:在标签中添加title属性 1.文本中如何添加提示信息? 1.1直接在标签中加title="值": 例如:<p title="爱笑,爱哭,爱生活"& ...

  3. bootstrap-datetimepicker 进一步跟进~~~开始时间和结束时间的样式显示

    上次简单介绍了一下:05.LoT.UI 前后台通用框架分解系列之——漂亮的时间选择器(http://www.cnblogs.com/dunitian/p/5524019.html) 这次深入再介绍一下 ...

  4. PHP的学习--RSA加密解密

    PHP服务端与客户端交互或者提供开放API时,通常需要对敏感的数据进行加密,这时候rsa非对称加密就能派上用处了. 举个通俗易懂的例子,假设我们再登录一个网站,发送账号和密码,请求被拦截了. 密码没加 ...

  5. 挑子学习笔记:特征选择——基于假设检验的Filter方法

    转载请标明出处: http://www.cnblogs.com/tiaozistudy/p/hypothesis_testing_based_feature_selection.html Filter ...

  6. javascript有用小功能总结(未完待续)

    1)javascript让页面标题滚动效果 代码如下: <title>您好,欢迎访问我的博客</title> <script type="text/javasc ...

  7. BZOJ 3238: [Ahoi2013]差异 [后缀数组 单调栈]

    3238: [Ahoi2013]差异 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2326  Solved: 1054[Submit][Status ...

  8. 好好了解一下Cookie

    Cookie的诞生 由于HTTP协议是无状态的,而服务器端的业务必须是要有状态的.Cookie诞生的最初目的是为了存储web中的状态信息,以方便服务器端使用.比如判断用户是否是第一次访问网站.目前最新 ...

  9. Sass用法指南

    写在前面的话:随着CSS文件越来越大,内容越来越复杂,对其进行很好的维护将变的很困难.这时CSS预处理器就能够帮上大忙了,它们往往拥有变量.嵌套.继承等许多CSS不具备的特性.有很多CSS预处理器,这 ...

  10. 小丁带你走进git的世界四-重写历史记录

    一.git对象文件创建 开篇先补充一个知识点,就是比如我建立一个文件之后,使用git add就会生成一个git对象,但是git对象生成后可以在.git/objects里面对应,首先我们来初始化一个仓库 ...