冒泡排序 选择排序 数组
一.冒泡排序
核心原理
循环遍历数组
当前单元和下一个单元进行数据比较
按照从小到大排序
应该是当前单元小于下一个单元
如果当前单元大于下一个单元
将交换两个单元存储的数据
一次循环结束会将一个最大值存储到数组末位
多次循环遍历完成整个数组中数值的排序
案例:
var arr=[10,20,30,40,50];
var n=11;
arr.push(n);
//冒泡排序
for(var k =0; k<arr.length; k++){
for(var i=0; i<arr.length-1-k; k++){
if(arr[i]>arr[i+1]){
var temp=arr[i]
arr[i]=arr[i+1]
arr[i+1]=temp
}
}
}
console.log('冒泡排序结束后的arr',arr);
二.选择排序
核心原理
每次使用变量存储起始循环单元的索引下标
使用变量中存储的索引下标对应的数据数值
和之后的其他单元的数据数值进行比较
如果之后循环单元数据数值小于变量中存储索引下标对应数据数值
变量存储循环单元的索引下标
循环结束 变量中存储本次循环 存储最小值单元的索引下标
如果变量存储的索引下标不是起始单元的索引下标
交换两个单元存储的数据数值
每次循环会将最小值存储到数组的起始位置
多次循环完成整个数组的排序
案例:
for(var k=0; k < arr.length; k++){
for(var i =k+1; i<arr.length; i++){
if(arr[minIndex]>arr[i]){
minIndex=i
}
}
//交换真实最小的值 与下标0的值
var temp=arr[k]
arr[k]=arr[minIndex]
arr[minIndex]=temp
}
console.log('选择排序结束后的arr:',arr)
三、数组
1.概念:存储数据的集合
2.理解:
- 其他数据类型一个变量中只能存储一个数据单元
- 在数组中可以同时存储多个数据单元
3.语法
-
字面量: var 变量=[数据1,数据2,数据3...];
-
内置构造函数: var 变量 = [new Array(数据1,数据2, 数据3);
属性 下标 在定义数组时 JavaScript程序 自动定义的从0开始的连续整数 如果下标是 数值类型 称为 索引下标 在 JavaScript中 下标只支持是数值类型的索引下标 在 其他计算机语言中 数组的下标可以是字符串类型 称为 关联下标 通过 索引下标 使用 []语法 操作 数组中的数据单元 length 数组的长度 也就是 数组中单元个数 语法 数组.length 索引下标是从0开始的连续整数 数组索引下标的范围是 0 至 数组.length-1 数据存储的数据类型 在 JavaScript语言中 数组中可以存储任意 JavaScript支持的数据类型 一个数组中 可以 存储不同类型的数据 数组中存储函数 var arr = [100,200,300,function(){} ]; 一般情况下 数组中 不会存储函数 数组[索引下标] 获取的是 数组单元中存储的内存地址 数组[索引下标]() 是 调用执行 数组中存储的函数
2、数组的操作
1、首位新增:
数组.unshift( 数据1 , 数据2 ... );
在数组的首位新增数据单元,一次可以新增一个单元 或者 多个单元
多个单元之间使用逗号间隔
执行结果返回值:新增单元之后 新数组的长度
2、末位新增:
数组.push( 数据1 , 数据2 ... );
在数组的末位新增数据单元
次可以新增一个单元 或者 多个单元
多个单元之间使用逗号间隔
执行结果返回值:新增单元之后新数组的长度
3、首位删除:
数组.shift();
一次只能删除一个单元
执行结果返回值:删除单元存储的数据数值
4、末位删除:
数组.pop();
一次只能删除一个单元
执行结果返回值:删除单元存储的数据数值
案例:
<script>
var arr = [100,200,300,400,500];
// 首位新增
var res1 = arr.unshift( '北京' , '上海' );
console.log( res1 );
// 末位新增
var res2 = arr.push('贵阳' , '武汉');
console.log( res2 );
// 首位删除
// 删除首位单元 也就是 删除第一个单元
// 第一个单元中存储的数据是 '北京'
var res3 = arr.shift();
console.log( res3 );
var res4 = arr.pop();
console.log( res4 );
console.log( arr );
</script>
5、数组删除指定单元
数组.splice( 参数1 , 参数2 , [ 其他所有参数 ] );
参数1 删除起始位置的索引下标
参数2 删除数组单元的个数 必须是连续的数组单元
其他所有参数 在删除位置替换写入的新内容
可以一次替换写入一个单元 可以 提替换写入多个单元
执行结果返回值 是 删除单元数据 组成的新数组
案例:
<script>
var arr = [100,200,300,400,500,600,700,800,900];
// // 如果要删除 300 400 500 三个单元
// // 是 从 索引下标是 2 的位置开始 删除 3个单元
// // 执行结果返回值 是 删除的 300 400 500 组成的新数组
// var res1 = arr.splice( 2 , 3 );
// console.log( res1 );
// 如果删除 500 600 替换 写入 新内容
var res2 = arr.splice( 4 , 2 , '北京' , '上海' , '广州' , '重庆' , '贵阳' );
console.log( res2 );
console.log( arr );
</script>
6、数组数据的查询
数组.indexOf( 数值数据 )
查询 指定数据 在数组中 第一次 出现的位置
如果有符合的数据 返回值 是 存储数据单元的索引下标
如果没有符合的数据 返回值 是 -1
数组.lastIndexOf( 数值数据 )
查询 指定数据 在数组中 最后一次 出现的位置
如果有符合的数据 返回值 是 存储数据单元的索引下标
如果没有符合的数据 返回值 是 -1
案例:
<script>
var arr = [ 1,2,3,1,2,3,4,1,2,3,4,5,1,2,3,4,5,6,1,2,3,4,5,6,7 ];
console.log( arr );
// 查询 数值1 在数组中第一次出现的位置
// 如果有符合的数据 返回值 是 存储数据单元的索引下标
var res1 = arr.indexOf( 1 );
console.log( res1 );
var res2 = arr.indexOf( 4 );
console.log( res2 );
// 查询 数值1 在数组中最后一次出现的位置
// 如果有符合的数据 返回值 是 存储数据单元的索引下标
var res3 = arr.lastIndexOf( 1 );
console.log( res3 );
// 查询 字符a 在数组中出现的位置
// 没有匹配的数据 返回值 是 -1
// 执行结果是 -1 也就是 意味着 数组中没有存储这个数据
var res4 = arr.indexOf( 'a' );
var res5 = arr.lastIndexOf( 'a' );
console.log( res4 );
console.log( res5 );
</script>
7、数组的去重
数组去重的12种方法: blog.csdn.net/weixin_4631…
实际项目中推荐使用使用 set数据类型方法
数组去重方法1 indexOf
数组中默认是可以存储重复数据
实际项目中 数组中不能存储重复数据
不需要去除数组中重复的数据
去重的基本原理
创建一个新的空数组
将原始数组数据 写入新数组中
写入时执行判断,要写入的数据 新数组中没有 再执行写入操作
案例:
<script>
var arr = [1,2,3,1,2,3,4,1,2,3,4,5,1,2,3,4,5,6,1,2,3,4,5,6,7];
console.log( arr );
// indexOf / lastIndexOf 方法
// 创建一个空数组
var newArr = [] ;
// // 将 原始数组的数据 写入新数组
// // 需要循环遍历 原始数组的每一个单元
// for( var i = 0 ; i <= arr.length-1 ; i++ ){
// // i 是 原始数组arr的索引下标
// // arr[i] 是 原始数组arr中 数据单元存储的数据数值
// // console.log( arr[i] );
// // 将 原始数组的数据数值 也就是arr[i] 写入 新数组中
// // 为了确数据的顺序相同 使用 末位新增数据语法
// // 执行判断 新数组中 没有 要写入的数据 再执行写入操作
// // 在 新数组中 查询 要写入的数据 arr[i]
// // 如果 查询结果是 -1 证明 新数组中没有要写入的数据 arr[i]
// // 可以 执行写入操作
// if( newArr.indexOf( arr[i] ) === -1 ){
// // 在 新数组中 查询 要写入的 数据 arr[i]
// // 如果查询结果是 -1 也就是 新数组中没有要写入的原始数组数据arr[i];
// // 执行 末位新增数据操作
// newArr.push( arr[i] );
// }
// }
8、数组的截取
数组的截取方法
从数组中 截取 部分数据单元 组成新数组
截取函数的执行结果 返回值 是 截取的新数组
! 不会改变 原始数组中 存储的数据内容
语法
var 变量 = 数组.slice( 参数1 , 参数2 );
执行结果返回值 是 截取原始数组内容 组成的新数组
参数1 截取起始位置的索引下标
参数2 截取结束位置的索引下标
! 截取结果不包括结束位置的数据数值
案例:
<script>
var arr = [100,200,300,400,500,600,700,800,900];
// // 数组的删除操作 执行结果返回值 是 删除的数组单元组成的新数组
// // 但是会改变原始数组中存储的内容
// var res1 = arr.splice( 2 , 4 );
// console.log( res1 );
// 从 索引下标是 2 的单元开始截取
// 截取至 索引下标是 6 的单元 结束
// 截取 结果 是 索引下标 是 2 3 4 5 的 4个单元的数据
// 没有 结束位置 索引下标是6的单元的数据
var res2 = arr.slice( 2 , 6 );
console.log( res2 );
console.log( arr );
</script>
9、数组反转
<script>
/*
数组的反转
将 原始数组内容都反向排序
数组.reverse()
*/
var arr = [100,200,300,400,500];
arr.reverse();
console.log( arr );
</script>
10、数组排序
数组的排序方法:
数组.sort();
按照 首字符的大小排序
数组.sort(function( 参数1 , 参数2 ){ return 参数1 - 参数2 })
小 到 大 排序
数组.sort(function( 参数1 , 参数2 ){ return 参数2 - 参数1 })
从 大 到 小 排序
案例:
<script>
var arr = [312,432,456,567,897,234,123,6543,7865,434,1234,213,465,43,]
// 首字符排序
arr.sort();
// 小 -- 大
arr.sort( function( a , b ){ return a - b });
// 大 -- 小
arr.sort( function( num1 , num2 ){ return num2 - num1 });
console.log( arr );
</script>
11、数组拼接
<script>
/*
数组的拼接操作
将两个数值的数据 拼接成 一个数组
不会改变原始数组的内容
执行结果返回值是 两个数值拼接的结果
var 变量 = 原始数组.concat( 数组1 , 数组2 .... );
可以将 一个或者多个数值的数据 拼接到一个数组中
*/
var arr = [100,200,300];
var arr1 = [400,500,600];
var arr2 = [700,800,900];
var res = arr.concat( arr1 , arr2 );
console.log( arr );
console.log( res );
</script>
12、数组字符串转换
数组 --- 字符串
var 变量 = 数组.join();
将数组数据拼接为字符串
以 逗号 为间隔符号
var 变量 = 数组.join('间隔符号');
将数组数据拼接为字符串
以 设定的符号 为间隔符号
var 变量 = 数组.join('');
将数组数据拼接为字符串
以 设定参数是 空字符串 没有 间隔内容
字符串 --- 数组
var 变量 = 字符串.split();
案例:
<script>
// var arr = [100,200,300,400,500,600];
// // 没有定义参数 默认以逗号为间隔符号
// // 获取数组中每一个数据单元的数值 拼接为 字符串
// var res1 = arr.join();
// console.log( res1 );
// // 以设定的符号 为间隔符号
// // 获取数组中每一个数据单元的数值 拼接为 字符串
// var res2 = arr.join('-');
// console.log( res2 );
// // 设定空字符串 没有 间隔内容
// // 获取数组中每一个数据单元的数值 拼接为 字符串
// var res3 = arr.join('');
// console.log( res3 );
var str = 'abc-abc-abc-abc-abc';
// 将字符串转化为数组
// 没有设定参数 整个字符串作为一个整体存储到数组中
var res1 = str.split();
console.log( res1 );
// 将字符串转化为数组
// 以设定的 间隔符号 作为依据 将字符串分割
// 分割结果中 不包括 分割符号
// 也就是 设定 '-' 分割结果中 没有 '-'
// 字符串 'abc-abc-abc-abc-abc'
// 按照 - 减号 进行分割 结果是 abc abc abc abc abc
var res2 = str.split('-');
console.log( res2 );
// 使用 空字符串 作为 分割符号 每一个字符都是一个数组单元
var res3 = str.split('');
console.log( res3 );
</script>
数组的复杂查询
1, 数组的简单查询
数组.indexOf( 数据 )
数组.lastIndexOf( 数据 )
返回 索引下标 / -1
数据只能是 基本数据类型
// indexOf
var arr = [1,25,,5,2,,8,3,4,7,6,]
console.log('原始数组: ', arr)
var num = arr.indexOf(4, 5)
console.log('indexOf 后的 arr: ', arr)
console.log('indexOf 的返回值: ', num)
// lastIndexOf
var num = arr.lastIndexOf(4, 4)
console.log('lastIndexOf 后的 arr: ', arr)
console.log('lastIndexOf 的返回值: ', num)