七大排序算法总结 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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 在菲律宾怎么办持枪证? 绝地求生打不准怎么办 身份证号码变更后社保怎么办 社保与身份不符怎么办 年龄改了学籍怎么办 结婚证信息错误怎么办 六级身份证过期怎么办 身份号泄露了怎么办 身体证信息泄露怎么办 手机号被泄漏了怎么办 姓名和电话泄露怎么办 个人身份证信息泄露怎么办 身份号码泄露了怎么办 我身份证泄露了怎么办 身份证信息泄漏了怎么办 无锡身份证丢了怎么办 人在外地怎么办身份证 欠空放公司不还怎么办 兼职要身份证照片怎么办 身份证刷不了磁怎么办 身份证不能刷了怎么办 身份证指纹错了怎么办 指纹手机丢了怎么办 异地办理临时身份证怎么办 杭州办理外地身份证怎么办 办理身份证没有户口本怎么办 2018身份证掉了怎么办 双户口注销社保怎么办 常用户口被注销怎么办 刚到厦门怎么办身份证 新疆身份证丢了怎么办 技能证书丢了怎么办 16岁拍身份证怎么办 16岁以下怎么办身份证 办身份证要证明怎么办 15岁怎么办银行卡淘宝 满16岁怎么办银行卡 电脑最小化后不见了怎么办 满16周岁怎么办银行卡 给儿童办身份证怎么办 当兵前身份证号码不符怎么办