算法:基于比较的排序算法
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
算法:基于比较的排序算法相关推荐
- c语言排序算法 应用与实现,基于C语言排序算法改进与应用.doc
基于C语言排序算法改进与应用 基于C语言排序算法改进与应用 摘 要:介绍了程序语言中排序的原理及应用,阐述了基于C语言的三种主要排序方法,提出了每种排序方法的改进,计算出改进后算法的时间复杂度,编写了 ...
- 七、基于比较的排序算法总结
1 问题 至此,总结一下已经研究过的排序算法: insertion sort,Θ(n2)\Theta(n^2)Θ(n2) merge sort, Θ(nlogn)\Theta(nlogn)Θ(nlog ...
- 基于使用学习排序算法的Web服务学习的个性化的决策战略
摘要----为了从类似的服务列表中进行功能上的选择,用户往往需要根据多个QoS准则做出他们的决定,它们需要对目标服务.在这个过程中,不同的用户可能遵循不同的决策策略,有些是补偿性的,在这个补偿中在所有 ...
- 排序算法 - 面试中的排序算法总结
排序算法总结 查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中.因为其实现代码较短,应用较常见.所以在面试中经常会问到排序算法及其相关的问题.但万变不离其宗,只要熟悉了思想,灵活运用也不 ...
- 机器学习(二十二)——推荐算法中的常用排序算法, Tri-training
推荐算法中的常用排序算法 Pointwise方法 Pranking (NIPS 2002), OAP-BPM (EMCL 2003), Ranking with Large Margin Princi ...
- 数据结构与算法--经典10大排序算法(动图演示)【建议收藏】
十大经典排序算法总结(动图演示) 算法分类 十大常见排序算法可分为两大类: 比较排序算法:通过比较来决定元素的位置,由于时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序 非比较类型排 ...
- 算法 - 十大经典排序算法(动图演示)
[TOC] 算法 - 十大经典排序算法(动图演示) 在计算机科学与数学中,一个排序算法(英语:Sorting algorithm)是一种能将一串资料依照特定排序方式进行排列的一种算法.最常用到的排 ...
- 基本算法研究1-冒泡排序算法测试
基本算法研究1-冒泡排序算法测试 1.经典冒泡排序法基本原理 先看一个动态图,感觉比较形象: 冒泡排序(Bubble Sort)是一种简单的排序算法.默认是从小到大排序,即把最大的数据排在最后,相当于 ...
- 排序算法:简单选择排序算法实现及分析
简单选择排序算法介绍 简单选择排序(Simple Selection Sort)就是通过n-1次关键字排序之间的比较,从n-i+1个记录中选择关键字最小的记录,并和第i(1<=i<=n)记 ...
- 【Java数据结构与算法】第六章 算法的时间复杂度、算法的空间复杂度和排序算法的介绍
第六章 算法的时间复杂度.算法的空间复杂度和排序算法的介绍 文章目录 第六章 算法的时间复杂度.算法的空间复杂度和排序算法的介绍 一.算法的时间复杂度 1.时间频度 2.时间复杂度 3.常见的时间复杂 ...
最新文章
- 2019年9月2日开学!寒假时间也定了……
- javascript与java的不同之处
- 预编译、作用域链和闭包理解
- javascript dom节点x
- 【资源下载】 UC 伯克利 Chelsea Finn 博士论文(新起之秀——MAML)《Learning to Learn with Gradients》下载--2018ACM最佳博士论文下载
- 操作excel方便么_【Excel好推荐】专业仪表板
- 记git升级版本之后出现fatal: NullReferenceException encountered问题
- ImageZoom 图片放大效果
- Mac OS 使用终端连接到Linux
- 穿墙贪吃蛇(C语言)
- Intellij Idea 导入项目
- comsol matlab安装教程,comsol和matlab接口
- GSON处理URL转码
- 【工作感想】 关于前后端分离的问题
- 永磁同步电机FOC控制之坐标变换:Clarke,Park,IPark,IClarke及算法实现流程
- Dialog dismiss 流程
- 计算机术语rander是什么意思,Rendering Engine,呈现引擎还是渲染引擎?
- 马无夜草不肥,人无横财不富
- [软件人生]别人对自己的评价应该如何看待(与张勋对话之五)
- php购物车登录用cookie,php利用cookies实现购物车的方法_PHP
热门文章
- 软件测试怎么跟踪缺陷,软件测试缺陷跟踪管理
- 【博客置顶】个人简介
- 在服务器上虚拟w7,如何在虚拟机中获取Win7 Aero特效(图)
- 关于搭建视频直播运营平台的一点经验和心得
- 一对一直播app源码,Aandroid动态切换主题色
- 从Visual Studio看微软20年技术变迁
- Unity-资源异步加载
- showToast:fail parameter error: parameter.title should be String instead of Null;
- NC208246 胖胖的牛牛
- python排列组合