JavaScript 数组常用算法总结——【查找算法、排序算法、二维数组排序和转置】

一、 查找算法

1. 顺序查找

依次查找每个元素;

//遍历一遍看是否找到
function generalSearch(arr,data){
	 for(var i = 0; i < arr.length; i++){
	 	if(arr[i] == data){
	 	return true;
	  	}
	 }
	return false;
}

2. 二分法查找(折半查找)

前提:被查找的序列必须是有序的;

var arr=[27,98,5,31,7,10]
var t=prompt("请输入要查找的数")
//需要先排序
for(var i=0;i<arr.length;i++){ //控制排序趟数
    for(var j=0;j<arr.length-1;j++){ //控制比较次数
        if (arr[j]>arr[j+1]) {
            var temp=arr[j]
            arr[j]=arr[j+1]
            arr[j+1]=temp
        }
    }
}
console.log("排序后的序列"+arr)
var i=0,j=arr.length-1
t=parseInt(t)
while (i<=j) {
    var mid=parseInt((i+j)/2)
    if (arr[mid]==t) {
        console.log("查找成功,下标是"+mid)
        break
    }
    else if (arr[mid]>t) { //左区间
        j=mid-1
    }else if(arr[mid]<t){ //右区间
        i=mid+1
    }
}
if (i>j) {
    console.log("没有找到"+t)
}

二、 排序算法:

1. 冒泡排序:

数组元素依次进行两两比较,两元素存在大小关系进行交换,直到数组有序。

var arr = [10, 7, 5, 31, 98, 27];
console.log('排序前的数组是' + arr);
for (var i = 0; i < arr.length - 1; i++) {
    for (var j = 0; j < arr.length - i  -  1; j++) {
        if (arr[j] > arr[j + 1]) {
            var temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
        }
    }
}
console.log('排序后的数组是' + arr);

2. 选择排序:

不停地把最小值找出来放在无序数列的最前面。

//选择法排序
var arr = [10, 7, 5, 31, 98, 27];
for (var i = 0; i < arr.length; i++) {
    var k = i;
    var min = arr[k];//假定无序数列的第一个数为最小值
    for (var j = i + 1; j < arr.length; j++) {//和i后面的数不停地进行比较,找出最小的数用k记录下标
        if (arr[j] < min) {
            min = arr[j];
            k = j;
        }
    }
    if (k != i) {//把最小值放到未排序中的第一个
        var temp = arr[i];
        arr[i] = arr[k];
        arr[k] = temp;
    }
}
console.log('排序后的数组是' + arr);

三、 翻转数组

翻转数组法1:简单但不推荐,不节省空间

var arr = [23,78,12,45,89,90];
var newArr = [];

for(var i = arr.length; i > 0; i--){
    newArr[newArr.length] = arr[i-1];        
}
console.log(newArr);

翻转数组法2:最推荐节省空间

var arr = [23,78,12,45,89,90];

for(var i = 0; i < arr.length/2; i++){
    var temp = arr[i];
    arr[i] = arr[arr.length-1-i];        
    arr[arr.length-1-i] = temp;        
}
console.log(arr);

翻转数组法3:

var arr = [23,78,12,45,89,90];
var i = 1;
var j = arr.length-1;

for(var i = 0; i < j; i++){
    var temp = arr[i];
    arr[i] = arr[j];        
    arr[j] = temp;  
    j--;      
}
console.log(arr);

四、 二维数组

定义:通过两个下标来确定一个数组元素
二维数组声明方式:

 	   var arr = new array();//先声明一维 
       for(var i=0;i<10;i++){//一维长度为10 
          arr[i]=new array();//声明二维 
          for(var j = 0; j < 10; j++){//二维长度为20 
             arr[i][j]=1; 
       	  } 
	   } 

1. 二维数组的转置

	var arr = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i'], ['j', 'k', 'l']];
	var res = [];
	for (i = 0; i < arr[0].length; i++) {
	    res[i] = [];
	    for (j = 0; j < arr.length; j++) {
	        res[i][j] = arr[j][i];
	    }
	}
	console.log(res);

2. 二维数组的排序

//冒泡排序
var arr = [[11, 22, 33], [44, 55, 66], [77, 88, 99]];
// var min = arr[0][0];
for (var i = 0; i < arr.length; i++) {
    for (var m = 0; m < arr[i].length - 1; m++) {
        for (var j = 0; j < arr[i].length - m - 1; j++) {
            if (arr[i][j] < arr[i][j + 1]) {
                var temp = arr[i][j];
                arr[i][j] = arr[i][j + 1];
                arr[i][j + 1] = temp;
                // min = arr[i][j];
            }
            // console.log(min);
        }
    }
}
console.log(arr);
// 选择排序
for (var i = 0; i < arr.length; i++) {
    for (var j = 0; j < arr[i].length; j++) {
        var n = j;
        var max = arr[i][j];
        for (var k = j + 1; k < arr[i].length; k++) {
            if (arr[i][j] > max) {
                max = arr[i][j];
                n = k;
            }
        }
        if (n != j) {
            temp = arr[i][j];
            arr[i][j] = arr[i][n];
            arr[i][n] = temp;
        }
    }
}
console.log(arr);
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值