|
1 | 1 | ## g_arithemetic
|
| 2 | +[](https://www.npmjs.com/package/g_arithemetic) |
| 3 | + |
| 4 | +[ |
| 5 | +](https://www.npmjs.com/package/g_arithemetic) |
2 | 6 |
|
3 | 7 | 前端算法代码收集库
|
4 | 8 |
|
|
36 | 40 | * [javascript CI篇](https://www.geekjc.com/book/5a9f552acb134c0648b75978)
|
37 | 41 | * [测试框架 Mocha 实例教程](http://www.ruanyifeng.com/blog/2015/12/a-mocha-tutorial-of-examples.html)
|
38 | 42 | * [karma 测试框架的前世今生](http://taobaofed.org/blog/2016/01/08/karma-origin/)
|
| 43 | + |
| 44 | + |
| 45 | +## 4. 常见算法 |
| 46 | + |
| 47 | +#### 4.1 二分查找 |
| 48 | + |
| 49 | +**算法介绍** |
| 50 | + |
| 51 | +二分法查找,也称折半查找,是一种在有序数组中查找特定元素的搜索算法。查找过程可以分为以下步骤: |
| 52 | +(1)首先,从有序数组的中间的元素开始搜索,如果该元素正好是目标元素(即要查找的元素),则搜索过程结束,否则进行下一步。 |
| 53 | +(2)如果目标元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半区域查找,然后重复第一步的操作。 |
| 54 | +(3)如果某一步数组为空,则表示找不到目标元素。 |
| 55 | + |
| 56 | +参考代码: |
| 57 | + |
| 58 | +**非递归算法** |
| 59 | + |
| 60 | +``` |
| 61 | +function binary_search(arr,key){ |
| 62 | + var low=0, |
| 63 | + high=arr.length-1; |
| 64 | + while(low<=high){ |
| 65 | + var mid=parseInt((high+low)/2); |
| 66 | + if(key==arr[mid]){ |
| 67 | + return mid; |
| 68 | + }else if(key>arr[mid]){ |
| 69 | + low=mid+1; |
| 70 | + }else if(key<arr[mid]){ |
| 71 | + high=mid-1; |
| 72 | + }else{ |
| 73 | + return -1; |
| 74 | + } |
| 75 | + } |
| 76 | +}; |
| 77 | +var arr=[1,2,3,4,5,6,7,8,9,10,11,23,44,86]; |
| 78 | +var result=binary_search(arr,10); |
| 79 | +alert(result); // 9 返回目标元素的索引值 |
| 80 | +``` |
| 81 | + |
| 82 | +**递归算法** |
| 83 | + |
| 84 | +``` |
| 85 | +function binary_search(arr,low,high,key){ |
| 86 | + if(low>high){ |
| 87 | + return -1; |
| 88 | + } |
| 89 | + var mid=parseInt((high+low)/2); |
| 90 | + if(arr[mid]==key){ |
| 91 | + return mid; |
| 92 | + }else if(arr[mid]>key){ |
| 93 | + high=mid-1; |
| 94 | + return binary_search(arr,low,high,key); |
| 95 | + }else if(arr[mid]<key){ |
| 96 | + low=mid+1; |
| 97 | + return binary_search(arr,low,high,key); |
| 98 | + } |
| 99 | +}; |
| 100 | +var arr=[1,2,3,4,5,6,7,8,9,10,11,23,44,86]; |
| 101 | +var result=binary_search(arr,0,13,10); |
| 102 | +alert(result); // 9 返回目标元素的索引值 |
| 103 | +``` |
| 104 | + |
| 105 | +#### 4.2 排序 |
| 106 | +###### 4.2.1 冒泡排序 |
| 107 | + |
| 108 | +**算法介绍** |
| 109 | + |
| 110 | +解析: |
| 111 | +1. 比较相邻的两个元素,如果前一个比后一个大,则交换位置。 |
| 112 | +2. 第一轮的时候最后一个元素应该是最大的一个。 |
| 113 | +3. 按照步骤一的方法进行相邻两个元素的比较,这个时候由于最后一个元素已经是最大的了,所以最后一个元素不用比较。 |
| 114 | + |
| 115 | +**js代码实现** |
| 116 | + |
| 117 | +``` |
| 118 | +function bubble_sort(arr){ |
| 119 | + for(var i=0;i<arr.length-1;i++){ |
| 120 | + for(var j=0;j<arr.length-i-1;j++){ |
| 121 | + if(arr[j]>arr[j+1]){ |
| 122 | + var swap=arr[j]; |
| 123 | + arr[j]=arr[j+1]; |
| 124 | + arr[j+1]=swap; |
| 125 | + } |
| 126 | + } |
| 127 | + } |
| 128 | +} |
| 129 | +
|
| 130 | +var arr=[3,1,5,7,2,4,9,6,10,8]; |
| 131 | +bubble_sort(arr); |
| 132 | +console.log(arr); |
| 133 | +``` |
| 134 | + |
| 135 | +###### 4.2.2快速排序 |
| 136 | + |
| 137 | +**js代码实现** |
| 138 | +解析:快速排序是对冒泡排序的一种改进,第一趟排序时将数据分成两部分,一部分比另一部分的所有数据都要小。然后递归调用,在两边都实行快速排序。 |
| 139 | +``` |
| 140 | +function quick_sort(arr){ |
| 141 | + if(arr.length<=1){ |
| 142 | + return arr; |
| 143 | + } |
| 144 | + var pivotIndex=Math.floor(arr.length/2); |
| 145 | + var pivot=arr.splice(pivotIndex,1)[0]; |
| 146 | +
|
| 147 | + var left=[]; |
| 148 | + var right=[]; |
| 149 | + for(var i=0;i<arr.length;i++){ |
| 150 | + if(arr[i]<pivot){ |
| 151 | + left.push(arr[i]); |
| 152 | + }else{ |
| 153 | + right.push(arr[i]); |
| 154 | + } |
| 155 | + } |
| 156 | +
|
| 157 | + return quick_sort(left).concat([pivot],quick_sort(right)); |
| 158 | +} |
| 159 | +
|
| 160 | +var arr=[5,6,2,1,3,8,7,1,2,3,4,7]; |
| 161 | +console.log(quick_sort(arr)); |
| 162 | +``` |
| 163 | + |
| 164 | +###### 4.2.3 插入排序 |
| 165 | +**算法介绍** |
| 166 | + |
| 167 | +解析: |
| 168 | +1. 从第一个元素开始,该元素可以认为已经被排序 |
| 169 | +2. 取出下一个元素,在已经排序的元素序列中从后向前扫描 |
| 170 | +3. 如果该元素(已排序)大于新元素,将该元素移到下一位置 |
| 171 | +4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 |
| 172 | +5. 将新元素插入到下一位置中 |
| 173 | +6. 重复步骤2 |
| 174 | + |
| 175 | +**js代码实现** |
| 176 | + |
| 177 | +``` |
| 178 | +function insert_sort(arr){ |
| 179 | + var i=1, |
| 180 | + j,key,len=arr.length; |
| 181 | + for(;i<len;i++){ |
| 182 | + var j=i; |
| 183 | + var key=arr[j]; |
| 184 | + while(--j>-1){ |
| 185 | + if(arr[j]>key){ |
| 186 | + arr[j+1]=arr[j]; |
| 187 | + }else{ |
| 188 | + break; |
| 189 | + } |
| 190 | + } |
| 191 | +
|
| 192 | + arr[j+1]=key; |
| 193 | + } |
| 194 | +
|
| 195 | + return arr; |
| 196 | +} |
| 197 | +
|
| 198 | +insert_sort([2,34,54,2,5,1,7]); |
| 199 | +``` |
| 200 | + |
| 201 | +## 5. 最后 |
| 202 | + |
| 203 | +这个库暂时只收集了很小的一部分,欢迎留言或者提issue或者PR补充常见算法,让更多的人学习。 |
0 commit comments