考试周终于来了,忙里偷闲的我又来整理学习笔记了,今天主要学习了数组和冒泡排序,冒泡排序相对来说还是比其他排序方法要好理解。
一、Array数组
数据类型里面分为基本和引用数据类型:
- 引用(复杂、复合)数据类型里面有哪些?function、Array、object
- Array数据类型
- 是一组数的集合,称之为数组
作用:
- 在实际的开发中遇到很多数据时,使用基本数据类型处理起来非常麻烦,这个时候就可以使用数组数据类型
- 数组数据类型里面可以放置任意数据类型
创建方式1:
- 使用构造函数形式创建数组,构造函数在js里面是创建对象的一种方式,数组也可以理解为是对象的一种
- 构造函数方式是系统给咱们提供的直接创建数组数据类型,构造函数和普通函数的区别在于,构造函数名称首字母是大写
- 创建方式语法:
new Array()
创建方式2:
- 使用字面量形式 使用中括号形式
- 创建方式语法: [ ]
- 字面量形式是一种简写形式,理解为是构造函数的简写
相关属性:
- 在数组创建的时候,系统会默认给每一个数组元素(成员)设置一个序号,把这个序号称之为数组下标
- 下标的作用是可以帮助咱们获取数组里面的数组元素
- 属性:length 表示数组的长度
- 注意点:数组的下标默认是从0开始的
如何操作:
- 使用下标操作数组
- 获取数组元素:数组名[下标]
- 查看数组里面有几个元素(成员) :数组名.length
- 获取数组里面最后一个元素:数组名.length-1
- 可以添加数组
注意:如果下标跳过,数组会默认给我们为空 - 可以替换数组 ——修改数组,相当于重新赋值
- 删除数组:delete 数组名[下标];
遍历:
- 从数组中把数据一个一个的读取或写入。
- 用代码来说明
var arr = [1, 2, 3, 4, 5, 6];
普通for循环
+ 顺序遍历
+ i表示的是数组的索引,或者叫做下标
for(var i = 0; i<arr.length; i++){
alert(arr[i]);
}
+ 倒序遍历
+ 注意数组遍历是从0开始的,所以 i >= 0
for(var i = arr.length-1; i>=0; i--){
alert(arr[i]);
}
for…in
+ 用于遍历数组或者对象的属性(快速遍历)
+ 注意:只能遍历数组和对象(object)
+ 语法:for(变量 in 集合) 集合:数组名和对象名
for(var i in arr){
//i默认字符串类型
alert(arr[i]);
}
补充
+ for 遍历出来的索引类型是number类型
+ for in 遍历出来的索引类型是string类型
引用数据类型叫做对象(object)
+ 语法:var obj = {
'a':1}
+ 对象里面把属性和值叫做键值对
+ 对象数据类型键要求是字符串类型,创建对象的时候不设置时,默认就是字符串
+ var obj = {
'a' : 1, 'b' : 2}
//获取对象的值的时候,要求中括号里面对象的键必须加引号
console.log(obj['a']);
//这里如果需要遍历就得需要 for in
arguments对象:
- arguments对象是function数据类型默认提供的,和return类似可以使用也可以不使用
- arguments为了解决函数形参过多的情况使用的
- 当函数的参数(实参)不确定时可以使用
- arguments.callee() 用于替代函数名称的
- arguments.length表示的是实参的个数
- arguments.callee.length表示的是形参的个数
- 问题
1、在实际开发中,当实参不确定的情况下,对应的形参无法确定,当函数的形参过多的情况不利于代码优化的
2、为了解决这种问题函数给我们提供了一个对象arguments,这个对象里面默认保存了所以实参的内容 - 数组类型:
1、真正的数组,自己创建出来的
2、类(伪)数组,为了方便使用数组的一些方法和属性,模拟的数组
数组的方法
//返回值是被删除的数组成员
shift():删除数组中第一个元素,并将长度减1.
pop():删除数组中最后一个元素,并将长度减1.
//返回值是数组的长度
unshift():往数组前面添加一个或多个数组元素,长度要改变。
push():往数组结尾添加一个或多个数组元素,长度要改变。
concat():方法用于连接两个或多个数组, 不改变原数组。返回一个新的数组。
//注意:它只会把数组直接反转,不能进行排序处理
reverse():逆向排序, 原数组会也被逆向排序
//注意:原数组不会被改变
toString():将数组转成字符串
join(“拼接符”):将数组转成字符串,中间以拼接符连接
slice(start,end):
+ 不修改原数组, 将原数组中的指定区域数据提取出来。
+ start开始 end结束,不含结束位置
+ 如果参数是负值表示从倒数开始
splice():
+ 删除:用于删除元素。
两个参数,第一个参数(要删除第一项的位置),第二个参数(要删除的项数)
+ 插入:向数组指定位置插入任意项元素。
三个参数,第一个参数(开始位置),第二个参数(0),第三个参数(插入的项)
注意:参数2给0,如果给成其他的值,表示删除几个
+ 替换:向数组指定位置插入任意项元素,同时删除任意数量的项。
三个参数,第一个参数(起始位置),第二个参数(删除的项数),第三个参数(插入任意数量的项)
二、冒泡排序
sort排序:
- 排序功能 从小到大 从大到小
- sort这个函数的参数就是一个函数
//a-b 如果它的值为正数,就交换它们的位置 从小到大
arr.sort(function (a, b) {
return a - b;
});
console.log(arr);
//b-a 如果它的值为正数,就交换它们的位置 从大到小
arr.sort(function (a, b) {
return b - a;
});
console.log(arr);
冒泡排序:
- 思路:一组无序的数字,两两进行比较,将大的放在后面,以此类推
- 冒泡排序涉及到交换两个变量的值,数组元素的值
- 交换两个变量的值,借用第三个变量
根据思路手动比较:
第一次比较:
3, 5, 1, 7
第二次比较:
3, 1, 5, 7
第三次比较:
1, 3, 5, 7
规律:四个数字,其实只比较了三次,就已经出结果了
var arr = [5, 3, 7, 1];
//外层循环执行一次,内层循环执行一轮
for(var i=0; i<arr.length; i++){
for(var j=0; j<arr.length; j++){
if(arr[j]>arr[j+1]){
var temp;
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
console.log(arr);
3, 5, 1, 7
第一次比较时已经把最大的比较出来了
3, 1, 5, 7
第二次比较的时候已经把第二大的比较出来了
1, 3, 5, 7
第三次比较的时候一行把第三大的比较出来了
优化版:
var num = [5,3,7,1];
function sortBubbling(arr){
for(var i=0; i<arr.length-1; i++){
// 0<4-1-0 1<4-1-0 2<4-1-0
// 0<4-1-1 1<4-1-1
// 0<4-1-2
for(var j=0; j<arr.length-1-i; j++){
console.log(j, j+1);
if(arr[j]>arr[j+1]){
var temp;
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
return arr
}
var res = sortBubbling(num);
console.log(res);