黑马程序员技术交流社区

标题: 【上海校区】常见的几种数组排序算法JS实现 [打印本页]

作者: 上海前端-达达    时间: 2018-10-18 15:56
标题: 【上海校区】常见的几种数组排序算法JS实现
快速排序
 从给定的数据中,随机抽出一项,这项的左边放所有比它小的,右边放比它大的,然后再分别这两边执行上述操作,采用的是递归的思想,总结出来就是 实现一层,分别给两边递归,设置好出口
[JavaScript] 纯文本查看 复制代码
function fastSort(array,head,tail){
    //考虑到给每个分区操作的时候都是在原有的数组中进行操作的,所以这里head,tail来确定分片的位置
    /*生成随机项*/
    var randomnum = Math.floor(ranDom(head,tail));
    var random = array[randomnum];
    /*将小于random的项放置在其左边  策略就是通过一个临时的数组来储存分好区的结果,再到原数组中替换*/
    var arrayTemp = [];
    var unshiftHead = 0;
    for(var i = head;i <= tail;i++){
      if(array<random){
        arrayTemp.unshift(array);
        unshiftHead++;
      }else if(array>random){
        arrayTemp.push(array);
      }
      /*当它等于的时候放哪,这里我想选择放到队列的前面,也就是从unshift后的第一个位置放置*/
      if(array===random){
        arrayTemp.splice(unshiftHead,0,array);
      }
    }
    /*将对应项覆盖原来的记录*/
    for(var j = head , u=0;j <= tail;j++,u++){
      array.splice(j,1,arrayTemp);
    }
    /*寻找中间项所在的index*/
    var nowIndex = array.indexOf(random);

    /*设置出口,当要放进去的片段只有2项的时候就可以收工了*/
    if(arrayTemp.length <= 2){
      return;
    }
    /*递归,同时应用其左右两个区域*/
    fastSort(array,head,nowIndex);
    fastSort(array,nowIndex+1,tail);
  }
插入排序
思想就是在已经排好序的数组中插入到相应的位置,以从小到大排序为例,扫描已经排好序的片段的每一项,如大于,则继续往后,直到他小于一项时,将其插入到这项的前面
[JavaScript] 纯文本查看 复制代码
function insertSort(array){
    /*start根据已排列好的项数决定*/
    var start=1;
    /*按顺序,每一项检查已排列好的序列*/
    for(var i=start; i<array.length; start++,i++){
      /*跟已排好序的序列做对比,并插入到合适的位置*/
      for(var j=0; j<start; j++){
        /*小于或者等于时(我们是升序)插入到该项前面*/
        if(array<=array[j]){
          console.log(array+' '+array[j]);
          array.splice(j,0,array);
          /*删除原有项*/
          array.splice(i+1,1);
          break;
        }
      }

    }
  }

冒泡排序
故名思意 ,就是一个个冒泡到最前端或者最后端,主要是通过两两依次比较,以升序为例,如果前一项比后一项大则交换顺序,一直比到最后一对

[JavaScript] 纯文本查看 复制代码
function bubbleSort(array){
    /*给每个未确定的位置做循环*/
    for(var unfix=array.length-1; unfix>0; unfix--){
      /*给进度做个记录,比到未确定位置*/
      for(var i=0; i<unfix;i++){
        if(array>array[i+1]){
          var temp = array;
          array.splice(i,1,array[i+1]);
          array.splice(i+1,1,temp);
        }
      }
    }
  }
选择排序
将当前未确定块的min或者max取出来插到最前面或者后面
[JavaScript] 纯文本查看 复制代码
function selectSort(array){
    /*给每个插入后的未确定的范围循环,初始是从0开始*/
    for(var unfixed=0; unfixed<array.length; unfixed++){
      /*设置当前范围的最小值和其索引*/
      var min = array[unfixed];
      var minIndex = unfixed;
      /*在该范围内选出最小值*/
      for(var j=unfixed+1; j<array.length; j++){
        if(min>array[j]){
          min = array[j];
          minIndex = j;
        }
      }
      /*将最小值插入到unfixed,并且把它所在的原有项替换成*/
      array.splice(unfixed,0,min);
      array.splice(minIndex+1,1);
    }
  }


作者: 不二晨    时间: 2018-10-18 16:15
奈斯
作者: 不二晨    时间: 2018-10-25 10:53

作者: 魔都黑马少年梦    时间: 2018-11-1 17:02





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2