学习JS的第7天
一、冒泡排序
1、冒泡排序算法的原理如下:
-
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
-
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。(第一轮比较出最大的数,第二轮比较出第二大的数,依次类推每一轮比较出当前轮最大数)
-
针对所有的元素重复以上的步骤,除了最后一个。
-
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
2、如何理解冒泡排序?
举例:给一个数组 a[5,3,7,1]
//5 3 7 1
/*在第一轮:5 3 7 1 --> 3 5 7 1 -> 3 5 7 1 -> 3 5 1 7 比较了3次
第二轮:3 5 1 7 --> 3 5 1 7 -> 3 1 5 7 -> 3 1 5 7 比较了3次
第三轮:3 1 5 7 --> 1 3 5 7 -> 1 3 5 7 -> 1 3 5 7 比较了3次
因此,我们可以发现这样 4个数字 只需要比较 3 轮 就可以排完-----n个数字比较n-1轮
n也可以指 数组的长度
*/
var a = [5,3,7,1];
for(var i = 0 ; i < a.length-1 ; i++ ) {//比较轮数
for(var j = 0 ; j < a.length-1 ; j++){ //每一轮的比较次数
if (a[j]>a[j+1]) {
var temp;
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
console.log(a);
但是,上述例子我们发现了还有一些缺点,因为我们每一次比较可以发现 每一轮比完就会比较出当前轮的最大值,那么下一轮比较就没有必要与最大(最小)值进行比较
//5 3 7 1
/*
第一轮(此时i=0):5 3 7 1 --> 3 5 7 1 -> 3 5 7 1 -> 3 5 1 7 最大值为7 比较3次
第二轮(此时i=1):3 5 1 7 --> 3 5 1 7 -> 3 1 5 7 第一轮已经比较出了最大值,就不必再对5 7进行比较 那么7就不用参与比较 参与比较的数字就少一位,变成3位 比较2次
第三轮(此时i=2):3 1 5 7 --> 1 3 5 7 那么同理 前两轮比较出了5 7,那么本轮只需要比较1次(1 3) 就已经完成排序。因此,我们在比较次数中可以得出一个规律:
每轮比较的次数 = 比较轮数 - 当前进行的轮数(i)
j = a.length-1 - i
真正的冒泡排序如下:
*/
var a = [5,3,7,1];
for(var i = 0 ; i < a.length-1 ; i++ ) {//比较轮数
for(var j = 0 ; j < a.length-1-i ; j++){ //每一轮的比较次数
if (a[j]>a[j+1]) { //大于 小于 决定升,降序
var temp;
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
console.log(a);
二、sort排序
sort() 方法对数组进行排序
sort()在无参的情况下,默认是以字符编码进行排序,如果是两位及以上的字母或两位及以上的数字,则会优先比较,第一位数字或字母的字符编码,若第一个数字或字母相同,那么接下来会根据第二位的字符编码进行比较并进行排序,若第二位相同,则比较第三位…依次类推。
sort()在有参的情况下:
//a-b 如果它的值为正数,就交换它们的位置
arr.sort(function(a, b){
return a - b;
})
//b-a 如果值为正数,交换它们的位置
arr.sort(function(a, b){
return b - a;
})
注意:这里有一个有趣的现象,在我验证完sort升降序,我们可以发现定义的参数a b,使用该函数过程
会发生颠倒 a b—>b a
var arr6 = [2, 3,10];
arr6.sort(function(a, b){
console.log('a='+a,'b='+b);
}) // a b 它的参数发生颠倒
// 3 2
// 10 3
三、选择排序
选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。
算法步骤
1、首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
2、再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
3、重复第二步,直到所有元素均排序完毕。
var arr = [9,4,3,0,8,10,6,2];
function ssort(arr){
var temp;
// 总共要经过 N-1 轮比较
for (var i = 0 ; i<arr.length-1;i++) {
var minindex = i ; //先预设一个最小下标
for(var j = i +1; j<arr.length;j++ ){
if(arr[j]<arr[minindex]){ //寻找最小的数
minindex = j; //保存最小数的小标
}
}
//交换 i和最小值
temp = arr[i];
arr[i] = arr[minindex];
arr[minindex] = temp;
}
return arr;
}
var res = ssort(arr);
console.log(res);
四、对象
JavaScript 中的所有事物都是对象:字符串、数字、数组、日期,等等。
在 JavaScript 中,对象是拥有属性和方法的数据。
1、什么是属性和方法?
属性是与对象相关的值。
方法是能够在对象上执行的动作。
举例:汽车就是现实生活中的对象,车长、座位、就是车的属性,车能够启动跑起来就是方法。
2、对象的分类:
1.内建对象
- 由ES标准中定义的对象,在任何的ES的实现中都可以使用
一比如: Math String Number Boolean Function object…(简单讲就是只要是JS这些都可以用)
2.宿主对象
-
由JS的运行环境提供的对象,目前来讲主要指由浏览器提供的对象
比如比如BOM 、 DOM(这是两组对象)。
3.自定义对象
- 由开发人员自己创建的对象
3、对象的基本操作
创建对象:
//构造函数方式
var obj = new Object();
//字面量形式
var obj = {};
var obj2 ={
name:'马保国',
age :69,
sex :'男',
label: '混元形意太极门掌门人',
skill:function(){
console.log('闪电五连鞭');
}
}
添加属性
语法:对象.属性名 = 属性值(属性值可以为任意数据类型)
语法2:对象[‘属性名’] = 属性值
//向 obj 中 添加一个name属性值
obj.name='小帅';
obj['name'] = '大帅';
读取对象中的属性 ----------- 语法:对象.属性名
console.log(obj.name);
console.log(obj['name']);
//使用[]操作对象更加灵活,——在[]中可以直接传递一个变量,变量值是多少就读取哪个属性
obj['name'] = '张山';
obj['123'] = '789';
var n = 'name'
console.log(obj['name']); // 张山
console.log(obj[n]); // 张山
修改属性 ------------语法:对象.属性名 = 新值
var obj = new Object();
obj.name='小帅';
console.log(obj.name); //小帅
obj.name='大帅';
console.log(obj.name); //大帅
删除属性 ---------------语法:delete 对象.属性名
delete obj.name;
如果想要知道一个对象里是否含有某个属性,该怎样做?
// in 运算符
// —— 通过该运算符可以检查一个对象中是否含有指定的属性
// 如果有则返回true,没有则返回false
-语法: "属性名" in 对象
console.log("name" in obj);