算法之排序
2018-06-24 01:58:01来源:未知 阅读 ()
1. 时间复杂度就是while的次数,二分查找O(h)=O(log2n)
2. 冒泡排序(O(n^2) 、稳定)
它重复地走访过要排序的数列,依次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
function bubbleSort(arr){ const len = arr.length; for(let i = 0; i < len; i++){ for(let j = 0; j < len - 1 - i; j++){ if(arr[j] > arr[j + 1]){ [arr[j], arr[j+1]] = [arr[j+1], arr[j]]; } } } return arr; }
3. 快排(O(nlogn))
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
var quickSort = function(arr){ if(arr.length <= 1) {return arr;} const midIndex = Math.floor(arr.length / 2); const mid = arr.splice(midIndex, 1)[0]; const left = [], right = []; arr.forEach(function(item){ if(item < mid){ left.push(item); }else{ right.push(item); } }) return quickSort(left).concat([mid], quickSort(right)); }
4. 选择排序 (O(n^2))
每次从待排序的数据中选出最小(或最大)的一个元素,存放在序列的起始位置,第二次从第二个开始,后面依次类推,直到全部待排序的数据元素排完。
function selectionSort(arr){ const first = arr[0]; for(var i=0;i<arr.length-1;i++){ let minIndex = i; for(var j=i+1;j<arr.length;j++){ if(arr[minIndex]>arr[j]){ minIndex = j; } } if(minIndex !== i){ const tmp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = tmp; } } return arr; }
5. 归并排序(O(nlogn) 、稳定)
先分解再合并,将有序子序列进行合并。
function mergeSort(arr){ if(arr.length <= 1){ return arr; } const midIndex = Math.floor(arr.length/2); const leftArr = arr.slice(0, midIndex); const rightArr = arr.slice(midIndex); return merge(mergeSort(leftArr), mergeSort(rightArr)); } function merge(left, right) { var result = []; while(left.length > 0 && right.length > 0) { if(left[0] < right[0]) { result.push(left.shift()); }else{ result.push(right.shift()); } } return result.concat(left).concat(right); }
6. 堆排序(O(nlogn))
堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值。
7. 直接插入排序(O(n^2) 、稳定)
每次将一个待排序的记录,按照其关键字的大小插入到有序队列的合适位置里,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序。
function insertionSort(arr) { let len = arr.length, preIndex, current; for (var i = 1; i < len; i++) { preIndex = i - 1; current = arr[i]; while(preIndex >= 0 && arr[preIndex] > current) { arr[preIndex+1] = arr[preIndex]; preIndex--; } arr[preIndex+1] = current; } return arr; }
8. 希尔排序(O(n^2))
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组。
function shellSort(arr) { let len = arr.length, temp, gap = 1; while(gap < len / 3) { gap = gap * 3 + 1; } for (gap; gap > 0; gap = Math.floor(gap/3)) { for (var i = gap; i < len; i++) { temp = arr[i]; for (var j = i-gap; j > 0 && arr[j] > temp; j -= gap) { arr[j + gap] = arr[j]; } arr[j + gap] = temp; } } return arr; }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 如何用算法删除重复数据 2020-03-18
- JavaScript实现实时反馈系统时间 2020-02-07
- js处理php输出时间戳对不上号的解决方法 2019-12-13
- JS实现简单的顶部定时关闭层效果 2019-11-30
- Javascript排序算法的介绍 2019-10-29
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash