【学习笔记四】- 用js实现的一些数组操作和算法

来源:互联网 发布:c语言 修改文件名 编辑:程序博客网 时间:2024/06/05 03:32

写在前面:

本人自学前端不久,博客的【学习笔记】既不算原创也不算转载,都是自己通过各个网站、博客、书籍、视频课程等学习的笔记,以及做的一些测试。

下面的代码是在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'));//kconsole.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));//6console.log(getIndex(arr,11));//-1console.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,324console.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,324console.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++){//找到最小数的下标赋值给indexif(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,324console.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,324console.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,324console.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 whilereturn 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);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,324console.log('--------------------------------');


阅读全文
0 0