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);