七大排序算法总结 JavaScript <堆还没写…………待续>
来源:互联网 发布:北京网站排名优化公司 编辑:程序博客网 时间:2024/05/23 12:43
动画演示http://www.webhek.com/misc/comparison-sort点击打开链接 -------<转>
冒泡,选择,插入,快速,归并,Shell,堆排序
用JavaScript实现
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title></title></head><body> <p onclick="bubble()">1.冒泡排序</p> <p onclick="bubble()">2.选择排序</p> <p onclick="insert()">3.插入排序</p> <p onclick="quick()">4.快速排序</p> <p onclick="merge()">5.归并排序</p> <p onclick="Shell()">6.Shell排序</p></body></html><script> Array.prototype.swap=function(i,j) { var temp = this[i]; this[i]=this[j]; this[j]=temp; } <!--冒泡排序--> // 1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。 // // 2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。 // // 3)针对所有的元素重复以上的步骤,除了最后一个。 // // 4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较 Array.prototype.bubbleSort = function() { for(var i=1;i<this.length;i++) { for(var j=0;j<this.length-i;j++) { if(this[j]>this[j+1]) { this.swap(j,j+1); } } } document.write(" 冒泡排序:"+this); } <!--选择排序-->// 1)首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置//// 2)再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。//// 3)重复第二步,直到所有元素均排序完毕。 Array.prototype.selectionSort=function() { for(var i=0;i<this.length;i++) { var index=i; for(var j=i+1;j<this.length;j++) { if(this[j]<this[index]) { index=j; } } this.swap(i,index); } document.write(" 选择排序:"+this); } <!--插入排序-->// 1)将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。//// 2)从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。// (如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。) Array.prototype.insertSort=function() { for(var i=1;i<this.length;i++) { var j = i; var target = this[i]; while (j > 0 && this[j - 1] > target) { this[j] = this[j - 1]; j--; } this[j] = target; } document.write(" 插入排序:"+this); } <!--快速排序-->// 1)设置两个变量I、J,排序开始的时候:I=0,J=N-1;// 2)以第一个数组元素作为关键数据,赋值给key,即 key=A[0];// 3)从J开始向前搜索,即由后开始向前搜索(J=J-1即J--),找到第一个小于key的值A[j],A[j]与A[i]交换;// 4)从I开始向后搜索,即由前开始向后搜索(I=I+1即I++),找到第一个大于key的A[i],A[i]与A[j]交换;// 5)重复第3、4、5步,直到 I=J; (3,4步是在程序中没找到时候j=j-1,i=i+1,直至找到为止。找到并交换的时候i,// j指针位置不变。另外当i=j这过程一定正好是i+或j-完成的最后另循环结束。) Array.prototype.quickSort=function(left,right) { if(left>=right) return; var i=left, j=right; var pivot=this[i]; while(i<j) { while (i < j && this[j] > pivot) j--; if (i < j) { this[i] = this[j]; } while (i < j && this[i] < pivot) i++; if (i < j) { this[j] = this[i]; } } this[i]=pivot; this.quickSort(left,i-1); this.quickSort(i+1,right); return this; } <!--归并排序-->// 归并过程为:比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;// 否则将第二个有序表中的元素a[j]复制到r[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,// 然后再将另一个有序表中剩余的元素复制到r中从下标k到下标t的单元。归并排序的算法我们通常用递归实现,// 先把待排序区间[s,t]以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并// 操作合并成有序的区间[s,t]。// 只要有一个序列非空,就要继续合并,因此在比较时不能直接比较A[x]和A[m],因为可能其中一个序列为空;// 正确的做法是:// 1:如果第二个序列为空,(此时第一个序列一定非空,不然就进不了while了~~)复制A[x];// 2:否则(第二个序列非空),要么第一个序列为空,要么第一个序列也非空,且A[x]<=A[m]时,才复制A[x]. Array.prototype.mergeSort=function(left,right,t)//left是0的话,right代表的是数组长度 { if(right-left>1) { var m=parseInt(left + (right-left)/2); var x=left,p= m,i=left;//记录左边数组下标,右边数组下标,新数组下标 this.mergeSort(left,m,t); this.mergeSort(m,right,t); while(x<m||p<right) { if(p>=right||(x<m&&(this[x]<=this[p]))) t[i++]=this[x++]; else t[i++]=this[p++]; } for(i=left;i<right;i++) { this[i]=t[i]; } } return this; } <!--Shell排序-->// 增量的取值规则为第一次取总长度的一半,第二次取一半的一半,依次累推直到1为止 Array.prototype.ShellSort=function() { var group, i, j; var len=this.length; for(group=parseInt(len/2);group>0;group=parseInt(group/2)) { for(i=group;i<len;i++) { for(j=i-group;j>=0;j=j-group) { if(this[j]>this[j+group]) this.swap(j,j+group); } } } document.write("Shell排序:"+this); } var list = new Array(); for(var i=0;i<5;i++) { list[i]=Math.floor(Math.random()*99+1); } document.write(list); function bubble() { document.write(list); list.bubbleSort(); } function selection() { document.write(list); list.selectionSort(); } function insert() { document.write(list); list.insertSort();} function quick() { document.write(list); document.write("快速排序:"); var arr = list.quickSort(0, list.length - 1); document.write(arr); } function merge() { document.write(list); document.write("归并排序:"); var bb=new Array(list.length); var arr1=list.mergeSort(0,list.length,bb) document.write(arr1); } function Shell() { document.write(list); list.ShellSort(); } </script>
0 0
- 七大排序算法总结 JavaScript <堆还没写…………待续>
- 七大排序算法总结
- 七大排序算法总结
- 七大排序算法总结
- 七大常见排序算法总结
- 数据结构--七大排序算法总结
- 七大常见排序算法总结
- 排序算法之七大排序算法总结
- 经典算法之七大排序总结篇
- 经典算法之七大排序总结篇
- 七大排序算法的研究与总结
- 七大排序算法总结(含优化)
- 数据结构与算法之七大排序总结
- 经典算法之七大排序总结篇
- 插件开发总结(待续……)
- 未完,待续……
- 七大排序算法
- 七大排序算法
- mysql实现主从复制
- 使用Maven构建Eclipse支持的Java项目
- QT中QPainterPath类的功能和使用方法
- C++第1-1次上机实验
- 记录准备看一下的linux开源小项目
- 七大排序算法总结 JavaScript <堆还没写…………待续>
- BZOJ 2097 USACO 2010 Dec Gold Exercise 奶牛健美操 二分答案 树形DP 贪心
- unity安卓和IOS的本地消息推送
- ping某个域名的详细过程
- 刘汝佳黑书笔记
- STM32串口中断接收和中断发送
- hihoCoder #1039 : 字符消除
- 使用GridViewWithHeaderAndFooter为gridView添加页头的方法
- 振兴中华(又见递归搜索)