前端代码之选择排序+冒泡排序

//选择排序
//思想:每个数与未排好的第一个数进行比较,如果比他小,就调换位置,每次循环确定一个最小的数
//伪代码:
for i<-0 to arr.length
  for j<-i to arr.length
    if(arr[j]<arr[i])
      swap(arr[j],arr[i])
return arr

//实际代码:
function selectSort(arr){
    for(var i=0;i<arr.length;i++){
        for(var j=i;j<arr.length;j++){
            if(arr[j]<arr[i]){
                var temp = arr[j]
                arr[j] = arr[i]
                arr[i] = temp
            }
        }
    }
    return arr
}
//冒泡排序
//思想:也是每次循环确定一个数的位置,不过冒泡排序是将这个数从后往前,两两依次比较,将小的数往前冒泡(调换位置)。
//伪代码
for i<-0 to arr.length
  for j<-arr.length-1 to i
    if(arr[j] < arr[j-1])
      swap(arr[j],arr[j-1])
return arr
//实际代码
function bubbleSort(arr){
    for(var i = 0;i<arr.length;i++){
        for(var j=arr.length-1;j>i;j--){
            if(arr[j]<arr[j-1]){
                var temp = arr[j]
                arr[j] = arr[j-1]
                arr[j-1] = temp
            }
        }
    }
    return arr
}

ps:这两种算法的时间复杂度,最坏和平均都是O(n^2),选择排序的最好情况下为O(n^2),冒泡排序的最好情况下为O(n).空间复杂度都是O(1),表示在随着数组的增大,花费的空间不会随之变大,例如我们的写法中用到的i、j、temp,其实可以不用temp来将两个值进行交换(问题2)。

 

引申问题(抽风写的)

1.为什么冒泡排序最好情况下为O(n)呢?

  最好情况下,是数组基本有序

  在我们的代码中,我们可以看到不管是不是有序,其实时间复杂度都是O(n^2),真正的原因是,我们常说的冒泡排序其实是经过优化的。

//真正的冒泡排序
//优化思路:其实经历过第一次遍历之后,可以知道这个整个数组的冒泡过程中,是否发生了交换,如果没有发生过交换,那么我们知道这个数组是有序的,就break跳出吧。所以可以定义一个变量,来捕获是否发生了交换
function bubbleSort(arr){
   var isSort = false
    for(var i = 0;i<arr.length;i++){
        for(var j=arr.length-1;j>i;j--){
            if(arr[j]<arr[j-1]){
                var temp = arr[j]
                arr[j] = arr[j-1]
                arr[j-1] = temp
          isSort = true 
            }
        }
     if(isSort){
       break 
     }
    }
    return arr
}

2.不用第三个变量交换两个值?

  a = a + b

  b = a - b

  a = a - b

  可能存在的问题:第一步可能导致a+b的值溢出(问题3)

3.js的number限制

  js的number类型有个最大值(安全值)。即2的53次方,为9007199254740992

  所以一般使用string来进行大数的运算(大数运算传送门)和存储,在mysql中直接使用string来进行运算的

posted @ 2018-09-17 20:55  leerle  阅读(1310)  评论(0编辑  收藏  举报