基础算法学习之排序篇(js实现)
来源:互联网 发布:数控铣床编程30例带图 编辑:程序博客网 时间:2024/06/06 01:14
1,最近在看 啊哈算法,觉得很有趣,特把其中有意思的算法记下来,
简易的桶排序法
var a = new Array(2,5,3,4,6,8,4,4,2,9);var b = new Array(10); //标记数组var d = new Array(); //存放数组var i,j;for (i=0;i<=11;i++){ b[i] =0;}for( i=0,j=1;i <=10;i++,j++){ var c =a[i]; b[c]++;}for (i=0;i<=10;i++){ for (j =1;j<=b[i];j++) { d.push(i); }}console.log(d);
运行结果:
[ 2, 2, 3, 4, 4, 4, 5, 6, 8, 9 ]
[ 2, 2, 3, 4, 4, 4, 5, 6, 8, 9 ]
该算法实际是讲一列数组中的所有数都标记在一个数组里,最后在从小到大打印出现的次数所对应的数此算法优点是时间快,
缺点是如果数组的范围太过庞大就会出现异常,比如超过4 294 967 295。
算法时间度为O(M+N)
缺点是如果数组的范围太过庞大就会出现异常,比如超过4 294 967 295。
算法时间度为O(M+N)
冒泡排序
var c = new Array(1,8,6,18,16,548,21,5,63);var i,j;for(j=0;j<c.length-1;j++){ for (i = 0;i <=c.length-1;i++){ if(c[i]>c[i+1]){ var d = c[i+1]; c[i+1] = c[i]; c[i] = d; } }}console.log(c);运行结果:
[ 1, 5, 6, 8, 16, 18, 21, 63, 548 ]
上面的冒泡算法实现是按照每次比较相邻的两个数,把较大的数放在较小数的后面,依次比较到数组的最后一项
这时会发现最大的一位数已经交换到最后一位,称为归位,说明有一位数已经排好了,这一过程先称为一趟,接下来
接下来从新从数组的第一位开始相邻比较,交换位置,归位第二大的数,这样总共要经历n-1(假设有n个数组)趟。
该算法是双重嵌套循环所以这个算法的时间复杂度O(N^2).
缺点是时间复杂度高,效率低。
这时会发现最大的一位数已经交换到最后一位,称为归位,说明有一位数已经排好了,这一过程先称为一趟,接下来
接下来从新从数组的第一位开始相邻比较,交换位置,归位第二大的数,这样总共要经历n-1(假设有n个数组)趟。
该算法是双重嵌套循环所以这个算法的时间复杂度O(N^2).
缺点是时间复杂度高,效率低。
快速排序
var e = new Array(13,45,4,45,3,1,53,87,1,5);function quicksort(left,right) { var i,j,t,temp; if(left>right)return; temp = e[left]; i=left; j=right; while (i!=j){ while(e[j]>=temp && i <j){ j--; } while(e[i]<=temp && i <j){ i++; } if(i<j){ t = e[i]; e[i] = e[j]; e[j] = t; } } e[left] =e[i]; e[i] = temp; quicksort(left,i-1); quicksort(i+1,right); return;}quicksort(0,e.length-1);console.log(e);运行结果:
[ 1, 1, 3, 4, 5, 13, 45, 45, 53, 87 ]
快速排序法是采用“二分法”的思想,先用一个基数去比较,将要排序的数组分成两分,然后通过递归一一将
所有基数归位,具体过程如下
选取数组中最左边的基数是13
1 5 4 1 3 13 53 87 45 45 这是第一趟的结果 可以看到13把数组分为两半,并且自己位置也排好称为归位,接下来进入递归
1 选取的基数为1,1归位。接着在右递归
3 4 1 5 基数为5,归位,接着在左递归
1 3 4 基数为3,归位,接着在左递归
1 基数为1,归位,接着在右递归
4 基数为4,归位,接着在基数13的右边递归(实质是第一次的所有递归完成,进行下一步右递归)。
...(此处省略13以右排序,与左边相同)
1 1 3 4 5 13 ...
快速排序算法优点是算法比较快速高效,由于基数取得是第一位,并不是每次都能将数组很好的“二分”所以它的平均算法的时间复杂度O(NlogN)。
快速排序算法是最常用的算法之一,JavaScript中sort()方法就是快速排序。
所有基数归位,具体过程如下
选取数组中最左边的基数是13
1 5 4 1 3 13 53 87 45 45 这是第一趟的结果 可以看到13把数组分为两半,并且自己位置也排好称为归位,接下来进入递归
1 选取的基数为1,1归位。接着在右递归
3 4 1 5 基数为5,归位,接着在左递归
1 3 4 基数为3,归位,接着在左递归
1 基数为1,归位,接着在右递归
4 基数为4,归位,接着在基数13的右边递归(实质是第一次的所有递归完成,进行下一步右递归)。
...(此处省略13以右排序,与左边相同)
1 1 3 4 5 13 ...
快速排序算法优点是算法比较快速高效,由于基数取得是第一位,并不是每次都能将数组很好的“二分”所以它的平均算法的时间复杂度O(NlogN)。
快速排序算法是最常用的算法之一,JavaScript中sort()方法就是快速排序。
阅读全文
0 0
- 基础算法学习之排序篇(js实现)
- 算法 之 插入排序 的 JS 实现
- 算法基础之排序篇
- 排序算法之堆排序(js)
- 算法基础之排序篇-插入排序
- 算法基础之排序篇-冒泡排序
- 算法基础之排序篇-选择排序
- 算法基础之排序篇-快速排序
- 算法基础之排序篇-堆排序
- 算法基础之排序篇-归并排序
- 算法基础之排序篇-希尔排序
- 算法基础之排序篇-拓扑排序
- 排序算法JS实现
- Js实现排序算法
- js 实现排序算法
- 排序算法 JS实现
- js实现排序算法
- python实现基础排序算法之(冒泡排序)
- 李文星疑被饿死,尸检显示胃里“毫无食物”; 小米可穿戴设备全球第一,出货量超苹果30%
- YLBTool.framework YLBKit.framework 使用规范
- 2017.9.26 树链剖分+线段树 解题报告
- Idea中自动提示忽略大小写
- 2.6基本算法之动态规划 7624:山区建小学——区间DP
- 基础算法学习之排序篇(js实现)
- mybatis实现mapper文件热部署
- codevs 1995 黑魔法师之门 并查集 解题报告
- 2017-9-25离线赛总结
- 在服务器上运行Java程序,依赖文件夹中的jar包
- 王思聪的狗可可刷爆朋友圈;易到超40万司机成功提现;董明珠称5年内不讨论接班人...
- 山区建小学
- ChannelGroup—广播
- test