前端代码之选择排序+冒泡排序
//选择排序 //思想:每个数与未排好的第一个数进行比较,如果比他小,就调换位置,每次循环确定一个最小的数 //伪代码: 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来进行运算的