1、冒泡排序:

(1)平均时间复杂度:O(n2)

(2)最好时间复杂度:O(n)

(3)最坏时间复杂度:O(n2)

(5)空间复杂度:O(1)

(5)稳定性:稳定

(6)JavaScript实现:

function bubble ( arr ) {var len = arr.length;var tmp;//  外层循环负责控制排序的趟数for(var i = 0; i < len - 1; i++){// 内层循环负责进行一趟排序for(var j = 0; j < len - 1 - i; j++){if(arr[j + 1] < arr[j]){tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;};};};return arr;
};

2、选择排序:

(1)平均时间复杂度:O(n2)

(2)最好时间复杂度:O(n2)

(3)最坏时间复杂度:O(n2)

(4)空间复杂度:O(1)

(5)稳定性:不稳定

(6)JavaScript实现:

function select( arr ) {var len = arr.length;// 外层循环需要进行len - 1趟排序for(var i = 0; i < len - 1; i++){var index = i;var min = arr[i];var tmp;// 内层循环从未排序的数组元素中比较出最小的一个for(var j = i + 1; j < len; j++){if(min > arr[j]){index = j;min = arr[j];};};// 将其放在排序后的数组元素的最后tmp = arr[i];arr[i] = min;arr[index] = tmp;};
};

3、插入排序:

(1)平均时间复杂度:O(n2)

(2)最好时间复杂度:O(n)

(3)平均时间复杂度:O(n2)

(4)空间复杂度:O(1)

(5)稳定性:稳定

(6)JavaScript实现:

  遍历数组,遍历到i时,a0,a1...ai-1是已经排好序的,取出ai,从ai-1开始向前和每个比较大小,如果小于,则将此位置元素向后移动,继续先前比较,如果不小于,则放到正在比较的元素之后。可见相等元素比较是,原来靠后的还是拍在后边,所以插入排序是稳定的。当待排序的数据基本有序时,插入排序的效率比较高,只需要进行很少的数据移动。

function insert ( arr ) { var len = arr.length;var tmp;for(var i = 1; i < len; i++){// 取出当前的数组元素tmp = arr[i];for(var j = i - 1; j >= 0; j--){if (arr[j] > tmp) {arr[j+1] = arr[j];} else {break;};};// 插入取出的数组元素arr[j+1] = tmp;};return arr;
}

4、希尔排序:

(1)平均时间复杂度:O(nlogn) ~ O(n2)

(2)最好时间复杂度:O(n1.3)

(3)最坏时间复杂度:O(n2)

(4)空间复杂度:O(1)

(5)稳定性:不稳定

(6)JavaScript实现:

// 插入排序
function sort( arr, di ){for(var i = di; i < arr.length; i++){var guard = arr[i];for(var j =i -di; j >= 0 && guard < arr[j]; j -= di){arr[j+di] = arr[j];};arr[j+di] = guard;};return arr;
}//  希尔排序,本质上是以不同的步长多次进行插入排序
//  步长的选择对希尔排序的效率有显著影响
function shell ( arr ) {var di = parseInt( arr.length / 2 );while ( di >= 1) {arr = sort( arr, di);di = parseInt( di / 2 );};return arr;
};

5、归并排序:

(1)平均时间复杂度:O(nlogn)

(2)最好时间复杂度:O(nlogn)

(3)最坏时间复杂度:O(nlogn)

(4)空间复杂度:O(n)

(5)稳定性:稳定

(6)JavaScript实现:

// 对被归并的左右两个数组进行归并排序
// 被输入的左右两个数组,都是有序的。
function merge (left, right){var l = 0,r = 0;var result = [];// 对左右两个数组的首项,进行比较,较小的推入栈中。while(l < left.length && r < right.length){if(left[l] < right[r]){result.push( left[l] );l += 1;} else {result.push( right[r] );r += 1;};};// 经过上面的比较,左右两个数组,必定有一个数组比较完毕,一个没有比较完毕。// 但是,在不同情况的递归层,有不同的表现,故而将二者未比较的元素都连接到result中。// 由于,左右两个数组在输入前就是有序的,剩余未经比较的数组元素也是有序的,且都大于之前经过比较的数组元素,故而可以将其连接到result。// 下方的代码,实质上是将左右数组中,未经比较的数组元素连接到result。result = result.concat( left.slice(l) );result = result.concat( right.slice(r) );return result;
};function mergeSort ( arr ){var len = arr.length;// 结束递归if(len <= 1){return arr;};// 切割数组,并对切割后的数组进行递归操作var middle = Math.floor( len/2 );var left = mergeSort( arr.slice(0, middle) );var right = mergeSort( arr.slice(middle) );// 完成递归后,进行归并return merge(left, right);
}

6、快速排序:
简称快排,时间复杂度并不固定,如果在最坏情况下(元素刚好是反向的)速度比较慢,达到 O(n^2)(和选择排序一个效率),但是如果在比较理想的情况下时间复杂度 O(nlogn)。

快排也是一个分治的算法,快排算法每次选择一个元素并且将整个数组以那个元素分为两部分,根据实现算法的不同,元素的选择一般有如下几种:

永远选择第一个元素
永远选择最后一个元素
随机选择元素
取中间值
整个快速排序的核心是分区(partition),分区的目的是传入一个数组和选定的一个元素,把所有小于那个元素的其他元素放在左边,大于的放在右边。

(1)平均时间复杂度:O(nlogn)

(2)最好时间复杂度:O(nlogn)

(3)最坏时间复杂度:O(n2)

(4)空间复杂度:O(logn) ~ O(n)

(5)稳定性:不稳定

(6)JavaScript实现:

function quick ( arr ) {var less = [],pivotList = [],more = [],result = [],len = arr.length;// 结束递归if(len <= 1){return arr;};// 与基准对比,将数组划分为小,中,大三组var pivot = arr[0];for(var i = 0; i <len; i++){if(arr[i] < pivot){less.push(arr[i]);} else if(arr[i] > pivot){more.push(arr[i]);} else {pivotList.push(arr[i]);};};// 递归地对划分出的小、大两个组进行快速排序less = quick(less);more = quick(more);// 将排序好的小,中,大三组连接起来 result = result.concat(less, pivotList, more);return result;
}

为什么哈希表的时间复杂度是常数阶O(1)

在哈希表中进行添加,删除,查找等操作,性能十分之高,不考虑哈希冲突的情况下,仅需一次定位即 可完成,时间复杂度为O(1),哈希表是如何实现达到惊艳的常数阶O(1)的呢?
我们知道,数据结构的物理存储结构只有两种:顺序存储结构和链式存储结构(像栈,队列,树,图等是从逻辑结构去抽象的,映射到内存中,也这两种物理组织形式),在数组中根据下标查找某个元素,一次定位就可以达到,哈希表利用了这种特性,哈希表的主干就是数组。
比如我们要新增或查找某个元素,我们通过把当前元素的关键字 通过某个函数映射到数组中的某个位置,通过数组下标一次定位就可完成操作。
存储位置 = f(关键字)
其中,这个函数f一般称为哈希函数,这个函数的设计好坏会直接影响到哈希表的优劣。
查找操作同理,先通过哈希函数计算出实际存储地址,然后从数组中对应地址取出即可。
所以,哈希表的时间复杂度就是常数阶O(1)。


https://blog.csdn.net/donggua3694857/article/details/52432906

算法:基于比较的排序算法相关推荐

  1. c语言排序算法 应用与实现,基于C语言排序算法改进与应用.doc

    基于C语言排序算法改进与应用 基于C语言排序算法改进与应用 摘 要:介绍了程序语言中排序的原理及应用,阐述了基于C语言的三种主要排序方法,提出了每种排序方法的改进,计算出改进后算法的时间复杂度,编写了 ...

  2. 七、基于比较的排序算法总结

    1 问题 至此,总结一下已经研究过的排序算法: insertion sort,Θ(n2)\Theta(n^2)Θ(n2) merge sort, Θ(nlogn)\Theta(nlogn)Θ(nlog ...

  3. 基于使用学习排序算法的Web服务学习的个性化的决策战略

    摘要----为了从类似的服务列表中进行功能上的选择,用户往往需要根据多个QoS准则做出他们的决定,它们需要对目标服务.在这个过程中,不同的用户可能遵循不同的决策策略,有些是补偿性的,在这个补偿中在所有 ...

  4. 排序算法 - 面试中的排序算法总结

    排序算法总结 查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中.因为其实现代码较短,应用较常见.所以在面试中经常会问到排序算法及其相关的问题.但万变不离其宗,只要熟悉了思想,灵活运用也不 ...

  5. 机器学习(二十二)——推荐算法中的常用排序算法, Tri-training

    推荐算法中的常用排序算法 Pointwise方法 Pranking (NIPS 2002), OAP-BPM (EMCL 2003), Ranking with Large Margin Princi ...

  6. 数据结构与算法--经典10大排序算法(动图演示)【建议收藏】

    十大经典排序算法总结(动图演示) 算法分类 十大常见排序算法可分为两大类: 比较排序算法:通过比较来决定元素的位置,由于时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序 非比较类型排 ...

  7. 算法 - 十大经典排序算法(动图演示)

    [TOC] 算法 - 十大经典排序算法(动图演示) ​ 在计算机科学与数学中,一个排序算法(英语:Sorting algorithm)是一种能将一串资料依照特定排序方式进行排列的一种算法.最常用到的排 ...

  8. 基本算法研究1-冒泡排序算法测试

    基本算法研究1-冒泡排序算法测试 1.经典冒泡排序法基本原理 先看一个动态图,感觉比较形象: 冒泡排序(Bubble Sort)是一种简单的排序算法.默认是从小到大排序,即把最大的数据排在最后,相当于 ...

  9. 排序算法:简单选择排序算法实现及分析

    简单选择排序算法介绍 简单选择排序(Simple Selection Sort)就是通过n-1次关键字排序之间的比较,从n-i+1个记录中选择关键字最小的记录,并和第i(1<=i<=n)记 ...

  10. 【Java数据结构与算法】第六章 算法的时间复杂度、算法的空间复杂度和排序算法的介绍

    第六章 算法的时间复杂度.算法的空间复杂度和排序算法的介绍 文章目录 第六章 算法的时间复杂度.算法的空间复杂度和排序算法的介绍 一.算法的时间复杂度 1.时间频度 2.时间复杂度 3.常见的时间复杂 ...

最新文章

  1. 2019年9月2日开学!寒假时间也定了……
  2. javascript与java的不同之处
  3. 预编译、作用域链和闭包理解
  4. javascript dom节点x
  5. 【资源下载】 UC 伯克利 Chelsea Finn 博士论文(新起之秀——MAML)《Learning to Learn with Gradients》下载--2018ACM最佳博士论文下载
  6. 操作excel方便么_【Excel好推荐】专业仪表板
  7. 记git升级版本之后出现fatal: NullReferenceException encountered问题
  8. ImageZoom 图片放大效果
  9. Mac OS 使用终端连接到Linux
  10. 穿墙贪吃蛇(C语言)
  11. Intellij Idea 导入项目
  12. comsol matlab安装教程,comsol和matlab接口
  13. GSON处理URL转码
  14. 【工作感想】 关于前后端分离的问题
  15. 永磁同步电机FOC控制之坐标变换:Clarke,Park,IPark,IClarke及算法实现流程
  16. Dialog dismiss 流程
  17. 计算机术语rander是什么意思,Rendering Engine,呈现引擎还是渲染引擎?
  18. 马无夜草不肥,人无横财不富
  19. [软件人生]别人对自己的评价应该如何看待(与张勋对话之五)
  20. php购物车登录用cookie,php利用cookies实现购物车的方法_PHP

热门文章

  1. 软件测试怎么跟踪缺陷,软件测试缺陷跟踪管理
  2. 【博客置顶】个人简介
  3. 在服务器上虚拟w7,如何在虚拟机中获取Win7 Aero特效(图)
  4. 关于搭建视频直播运营平台的一点经验和心得
  5. 一对一直播app源码,Aandroid动态切换主题色
  6. 从Visual Studio看微软20年技术变迁
  7. Unity-资源异步加载
  8. showToast:fail parameter error: parameter.title should be String instead of Null;
  9. NC208246 胖胖的牛牛
  10. python排列组合