【学习笔记四】- 用js实现的一些数组操作和算法
2017-09-01 00:04
841 查看
写在前面:
本人自学前端不久,博客的【学习笔记】既不算原创也不算转载,都是自己通过各个网站、博客、书籍、视频课程等学习的笔记,以及做的一些测试。
下面的代码是在sublime text3上编辑在nodejs上运行过的。
//利用object对数组去重
var a=[1,2,3,4],
b=[3,4,5,6],
c=a.concat(b),
obj={},
arr=[];
c.map(function(item){
obj[item]=null;
})
for(var key in obj){
arr.push(Number(key));
}
console.log(arr);//[ 1, 2, 3, 4, 5, 6 ]
console.log('--------------------------------');
本人自学前端不久,博客的【学习笔记】既不算原创也不算转载,都是自己通过各个网站、博客、书籍、视频课程等学习的笔记,以及做的一些测试。
下面的代码是在sublime text3上编辑在nodejs上运行过的。
//利用object对数组去重
var a=[1,2,3,4],
b=[3,4,5,6],
c=a.concat(b),
obj={},
arr=[];
c.map(function(item){
obj[item]=null;
})
for(var key in obj){
arr.push(Number(key));
}
console.log(arr);//[ 1, 2, 3, 4, 5, 6 ]
console.log('--------------------------------');
//在数组中间添加数组 var nums = [1,2,3,4,5,6,7]; var newElements = ['a',100]; nums.splice(Math.floor(nums.length / 2),0,newElements); console.log(nums);//[ 1, 2, 3, [ 'a', 100 ], 4, 5, 6, 7 ] var nums = [1,2,3,4,5,6,7]; nums.splice(Math.floor(nums.length / 2),0,'a',100); console.log(nums);//[ 1, 2, 3, 'a', 100, 4, 5, 6, 7 ] var nums = [1,2,3,4,5,6,7]; var newElements = ['a',100]; nums.splice.apply(nums, [Math.floor(nums.length)/2, 0].concat(newElements)) console.log(nums);//[ 1, 2, 3, 'a', 100, 4, 5, 6, 7 ] console.log('--------------------------------');
//找出给定字符串中出现次数最多的字母 function findMaxChar(str){ if(str.length<=1){ return str; } var obj={},char,count=1; for (var i = 0; i < str.length; i++) { if(!obj[str.charAt(i)]){ obj[str.charAt(i)]=1; }else{ obj[str.charAt(i)]+=1; } } for(var key in obj){ if(obj[key]>=count){ count=obj[key]; char=key; } } return char; } console.log(findMaxChar('fafdfdfaaakkkkkkkkklepoepwkkk'));//k console.log('--------------------------------');
//杨辉三角 var row=8, array=new Array();//[] for (var i = 0; i < row; i++) { var arrays=[]; for (var j = 0; j < i+1; j++) { if(i==0||j==0||j==i){ arrays.push(1); }else{ arrays.push(array[i-1][j-1]+array[i-1][j]); } } console.log(arrays); array.push(arrays); } /** [ 1 ] [ 1, 1 ] [ 1, 2, 1 ] [ 1, 3, 3, 1 ] [ 1, 4, 6, 4, 1 ] [ 1, 5, 10, 10, 5, 1 ] [ 1, 6, 15, 20, 15, 6, 1 ] [ 1, 7, 21, 35, 35, 21, 7, 1 ] */ console.log('--------------------------------');
//二分算法 //只能对已排好序的数组进行查找 var arr=[0,1,2,35,46,57,68,79]; function getIndex(array,value){ var a=0,b=array.length-1; while(a<=b){ var m=Math.floor((a+b)/2); if(value==array[m]){ return m; }else if(value>array[m]){ a=m+1; }else{ b=m-1; } } return -1;//没有找到元素返回-1 } console.log(getIndex(arr,68));//6 console.log(getIndex(arr,11));//-1 console.log('--------------------------------');
var arr=[324,42,3,-5,27,99,0]; console.log(arr.sort(function(a,b){return a-b;}));//[ -5, 0, 3, 27, 42, 99, 324 ] console.log(arr);//[ -5, 0, 3, 27, 42, 99, 324 ] sort改变原数组 console.log(arr.sort(function(a,b){return b-a;}));//[ 324, 99, 42, 27, 3, 0, -5 ] console.log('--------------------------------');
//冒泡排序 //时间复杂度O(n^2),是稳定的算法 //稳定的含义是:稳定排序算法会让原本有相等键值的纪录维持相对次序 // //从小到大排:(从大到小换成把小的往后扔就可以了) //依次比较相邻元素,保证较大的在后面 //一次遍历后,最大的数在最后面 //除去已扔到最后面的最大的数,对前面的元素重复上述步骤 //每次遍历后,需要比较的数少一个,重复直到没有元素可以比较 function bubbleSort(array){ if(array.length<=1){ return array; } for (var i = 0; i < array.length; i++) { for (var j = 0; j < array.length-1-i; j++) { if(array[j]>array[j+1]){ var temp = array[j+1]; array[j+1] = array[j]; array[j] = temp; } } } return array; } var arr=[324,42,3,-5,27,99,0]; console.log('bubbleSort: '+bubbleSort(arr));//bubbleSort: -5,0,3,27,42,99,324 console.log('--------------------------------');
//快速排序: //时间复杂度 O(nlogn),不稳定的排序 // //通过与一个中介元素比较,将要排序的数据分割成独立的3部分, //一部分所有数据都比中介小,另外一部分的所有数据都比中介大,中介自成一部分, //对非中介的两部分重复上述步骤,每次结束将三部分按顺序连接, //直到整个数组变成有序序列 function quickSort(array){ if(array.length<=1){ return array; } var m=array.splice(Math.floor(array.length/2),1)[0]; var left=[],right=[]; for (var i = 0; i < array.length; i++) { if(array[i]<m){ left.push(array[i]); }else{ right.push(array[i]); } } return quickSort(left).concat(m,quickSort(right)); } var nums = [324,42,3,-5,27,99,0]; console.log('quickSort: '+quickSort(nums));//quickSort: -5,0,3,27,42,99,324 console.log('--------------------------------');
//选择排序 //O(n^2),不稳定 //每次遍历找到最小的数,从前往后放 function selectionSort(array){ if(array.length<=1){ return array; } for (var i = 0; i < array.length; i++) { var index=i; for(var j=i+1;j<array.length;j++){ //找到最小数的下标赋值给index if(array[j]<array[index]) index=j; } var temp=array[i]; array[i]=array[index]; array[index]=temp; } return array; } var arr=[324,42,3,-5,27,99,0]; console.log('selectionSort: '+selectionSort(arr));//selectionSort: -5,0,3,27,42,99,324 console.log('--------------------------------');
//插入排序 //O(n^2),稳定 //把数组分为已排序和未排序两个部分 //对未排序数据在已排序序列中从后向前扫描插入 function insertionSort(arr){ if(arr.length<=1){ return arr; } for (var i = 1; i < arr.length; i++) { //已排序序列中只有arr[0] var temp=arr[i];//保存待插入数据 for(var j=i-1;j>=0 && arr[j]>temp;j--){ //在已排序序列中从后往前扫面,遇见比待排序数据大的则逐个往后移 arr[j+1]=arr[j]; } arr[j+1]=temp; } return arr; } var arr=[324,42,3,-5,27,99,0] console.log('insertionSort: '+insertionSort(arr));//insertionSort: -5,0,3,27,42,99,324 console.log('--------------------------------');
//希尔排序(增量排序) //复杂度O(nlog2n),不稳定 //由多次插入排序完成 //根据指定步长对元素进行分组 //如步长为3时,11个元素的数组分组结果为: //\0 3 6 9 \ 1 4 7 10 \ 2 5 8 \ //减少步长直到1,进行最后一次插入排序 function shellSort(arr){ if(arr.length<=1){ return arr; } var gap=Math.floor(arr.length/2); for(;gap>0;gap=Math.floor(gap/2)){ for (var i = 0; i < gap; i++) { //分组进行插入排序 for (var j = i; j < arr.length; j+=gap) { var temp=arr[j]; for(var k=j-1;k>=0 && arr[k]>temp;k--){ arr[k+1]=arr[k]; } arr[k+1]=temp; } } } return arr; } var arr=[324,42,3,-5,27,99,0] console.log('shellSort: '+shellSort(arr));//shellSort: -5,0,3,27,42,99,324 console.log('--------------------------------');
//归并排序 //O(nlogn),稳定 //建立在归并操作上 function merge(arr1,arr2){ var temp=[],i=0,j=0; while(i<arr1.length && j<arr2.length){ if(arr1[i]<=arr2[j]){ temp.push(arr1[i]); i++; }else{ temp.push(arr2[j]); j++; } }//end while return temp.concat(arr1.slice(i)).concat(arr2.slice(j)); } function mergeSort(arr){ if(arr.length<=1){ return arr; } var m=Math.floor(arr.length/2); var arr1=arr.slice(0, m); 9c1b var arr2=arr.slice(m); return merge(mergeSort(arr1), mergeSort(arr2)); } var arr=[324,42,3,-5,27,99,0] console.log('mergeSort: '+mergeSort(arr));//mergeSort: -5,0,3,27,42,99,324 console.log('--------------------------------');
相关文章推荐
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 习题2.8 随机数组的三种生成算法(补) 将bash的实现翻译成比较纯正的bash风格
- 数据结构与算法学习笔记——链表部分实现(数组形式)
- js数组操作学习笔记
- Scala学习笔记:数组操作与简单算法示例
- 算法(第四版)学习笔记之java实现可以动态调整数组大小的栈
- JS学习笔记1——不要使用JavaScript内置的parseInt()和Number()函数,利用map和reduce操作实现一个string2int()函数
- 有关集合算法的实现一些学习笔记
- 韩顺平_PHP程序员玩转算法公开课(第一季)07_使用数组实现堆栈_学习笔记_源代码图解_PPT文档整理
- 黑马程序员------学习笔记(1)数组实现班内学生的增删改查操作
- jQuery学习笔记(七)JS 一些基本操作代码整理
- pomelo学习笔记 (3) node.js 与 c 客户端 Diffie-Hellman 密钥交换算法的实现
- js学习笔记之数组Array的一些特性
- js操作数组中的数据--学习笔记
- js学习笔记13----数组的操作
- 算法(第四版)学习笔记之java实现能够动态调整数组大小的栈
- 客户端网络pomelo学习笔记 (3) node.js 与 c 客户端 Diffie-Hellman 密钥交换算法的实现客户端网络
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(7)习题2.8 随机数组的三种生成算法
- 后缀数组学习笔记——罗穗骞倍增算法代码
- Java学习笔记——文本操作(记事本实现)
- OpenCV学习笔记(四十八)——PCA算法实现core