你的位置:首页 > Java教程

[Java教程]JS之排序算法


在平时的工作中呢也用不到太多的算法,但是私认为算法还是挺锻炼一个程序员的逻辑思维的,写一下会的几种算法吧

冒泡排序:

function bubbleSort(arr){    for(var i=0;i<arr.length;i++){      for(var j=0;j<arr.length-i;j++){        if(arr[j]>arr[j+1]){          var num = arr[j];          arr[j] = arr[j+1];          arr[j+1] = num;        }      }      console.log(arr);    }    return arr  }  var num = [1,2,1,3,7,4,9,0];  console.log(bubbleSort(num));

解析一下:

·第一遍外循环i=0时,j也是0,j<arr.length-i的话呢,就是遍历整个数组,里面的if判断呢就是两两比较,arr[j]和arr[j+1]哪个大,然后把大的放在后面,这样就把数组中最大的那个家伙放到的数组末尾啦

·第二遍外循环i=1时,j还是0,j<arr.length-i呢,内循环就不会遍历到数组的末尾了,就是最大的那个家伙呢不用参加这次遍历了,那么这次呢,又把数组里面第二大的家伙排到了倒数第二的位置了

·后面就是同上类推了,理解一下的话,就是冒泡一样,把最大的一遍一遍的冒泡到数组的末尾,退出整个函数的时候呢,整个数组就排好顺序了

 

快速排序:

function quickSort(arr){    if(arr.length <= 1){      return arr;    }    var index = Math.floor(arr.length/2);    var middle = arr.splice(index,1);    var left = [];    var right = [];    for(var i=0;i<arr.length;i++) {      if(arr[i] < middle){        left.push(arr[i])      }else{        right.push(arr[i]);      }    }    return quickSort(left).concat(middle,quickSort(right));  }  var aaa = [1,3,2,7,1,5,9,2];  alert(quickSort(aaa));

解析:

·首先判断数组长度是否小于等于1,是的话直接return回去

·splice取出数组的中位数middle,整个数组里面没有middle这个数了哦

·新建两个left和right数组

·遍历整个数组,判断arr[i]是小于还是大于中位数middle,小于的push到left这个数组,大于的push到right这个数组里

·最后一句,将left和right两个数组当做参数递归调用quickSort函数。并且呢用concat连接起来,别忘了还有个中位数哦

·之后的递归就是回到第一步重复调用了,当left或者right数组长度为1时,就是排好顺序啦

整个快速排序算法的逻辑就是把数组对半,小的放左边,大的放右边,然后再把左右两边继续对半分,小的放左边,大的放右边,不断如此··········

拿写的aaa数组来说,中位数是7,那么left就是[1,3,2,1,5,2],right就是[9],然后递归left,还是很好理解的吧

 

 

最后是JS的array对象的sort方法排序,我也不知叫什么名-。-

function ArraySort(){    var tag = [];    for(var i= 0;i<arguments.length;i++){      tag.push(arguments[i]);    }    tag.sort(function(compare1,compare2){      return compare1 - compare2    })    return tag  }  console.log(ArraySort(1,2,5,1,2,3,9,7,8));

解析:

·sort方法传入两个参数compare1,compare2,两两进行比较,如果compare1-compare2小于0呢,两两之间就不换位置,反之就调换位置

·当然可以这样写 return compare2 - compare1,这样呢就是倒序排列了

 

本人资历尚浅,如果表达或者理解有错,欢迎大家指正交流