000本篇主要写的排序算法
sort()排序
sort()
这个当然是最简单的数组排序方法,但是字符串排序,
如果想数字排序可以这样写:
从小到大
var arr = [50, 30, 40, 10, 20];
arr.sort(function(value1, value2){
return value1 > value2;
})
alert();//10,20,30,40,50
从大到小
var arr = [50, 30, 40, 10, 20];
arr.sort(function(value1, value2){
return value1 < value2;
})
alert();//50,40,30,20,10
冒泡排序
规则:前后两个数,两两进行比较,如果符合交换条件,则交换位置。
特点:每一轮比较,都会有一个数,放在正确的位置。
第一轮:五次
9, 8, 7, 6, 5, 4
8, 9, 7, 6, 5, 4
8, 7, 9, 6, 5, 4
8, 7, 6, 9, 5, 4
8, 7, 6, 5, 9, 4
8, 7, 6, 5, 4, 9
第二轮:四次
8, 7, 6, 5, 4
7, 8, 6, 5, 4
7, 6, 8, 5, 4
7, 6, 5, 8, 4
7, 6, 5, 4, 8
第三轮:三次
7, 6, 5, 4
6, 7, 5, 4
6, 5, 7, 4
6, 5, 4, 7
第四轮:二次
6, 5, 4
5, 6, 4
5, 4, 6
第五轮:一次
5, 4
4, 5
比较轮数 = 数组的长度 - 1
每一轮比较的次数 = 数组的长度 - 比较的轮次
var arr = [9, 8, 7, 6, 5, 4];
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 tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
alert(arr);//4,5,6,7,8,9
选择排序
规律:每一次找出一个位置,这个位置上的数字和后面所有的数字进行比较,如果符合交换条件就交换位置。
特点:每一轮比较都会找出一个最小的数,放在正确的位置。
第一轮:
9, 8, 7, 6, 5, 4
8, 9, 7, 6, 5, 4
7, 9, 8, 6, 5, 4
6, 9, 8, 7, 5, 4
5, 9, 8, 7, 6, 4
4, 9, 8, 7, 6, 5
第二轮:
9, 8, 7, 6, 5
8, 9, 7, 6, 5
7, 9, 8, 6, 5
6, 9, 8, 7, 5
5, 9, 8, 7, 6
第三轮:
9, 8, 7, 6
8, 9, 7, 6
7, 9, 8, 6
6, 9, 8, 7
第四轮:
9, 8, 7
8, 9, 7
7, 9, 8
第五轮:
9, 8
8, 9
比较的轮数 = 数组的长度 - 1;
每一轮比较的次数 = 数组的长度 - 轮数
var arr = [9, 8, 7, 6, 5, 4];
for(var i = 0; i < arr.length - 1; i++){
for(var j = i + 1; j < arr.length; j++){
if(arr[i] > arr[j]){
var tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
alert(arr);
练习题
1、随机给出一个五位以内的数,然后输出该数共有多少位,每位分别是什么?
function countOfNum(num){
var arr = [];
while(num){
arr.push(num % 10);
num = parseInt(num / 10);
}
arr.reverse();
alert("一共有" + arr.length + "位");//一共有5位
alert("每一位分别是" + arr);//每一位分别是12345
}
countOfNum(12345);
2、编写函数map(arr) 把数组中的每一位数字都增加30%
function map(arr){
for(var i = 0; i < arr.length; i++){
arr[i] *= 1.3;
}
}
var arr1 = [10, 20, 30, 40];
map(arr1);
alert(arr1);//13,26,39,52
3.编写函数has(arr , 60) 判断数组中是否存在60这个元素,返回布尔类型。
function has(arr, item){
var isYes = false; //假设没有
for(var i in arr){
if(arr[i] === item){
isYes = true;
break;
}
}
return isYes;
}
alert(has(arr1, 30));
4.编写函数norepeat(arr) 将数组的重复元素去掉,并返回新的数组(拓展)
正序删除
var arr = [10, 20, 20, 30, 40, 30, 20, 10];
function norepeat(arr){
for(var i = 0; i < arr.length - 1; i++){
for(var j = i + 1; j < arr.length; j++){
if(arr[i] === arr[j]){
arr.splice(j, 1);
j--; //在重新判断一次这个位置的元素
}
}
}
}
norepeat(arr);
alert(arr);//10,20,30,40
倒序删除
var arr = [10, 20, 20, 30, 40, 30, 20, 10];
function norepeat(arr){
for(var i = arr.length - 1; i > 0; i--){
for(var j = i - 1; j >= 0; j--){
if(arr[i] === arr[j]){
arr.splice(j, 1);
}
}
}
}
norepeat(arr);
alert(arr);//40,30,20,10
快捷的数组去重的方法 低版本不兼容
这个超快了啦,但B事一堆IE8啦(台腔~笑)
var arr = [10, 20, 20, 30, 40, 30, 20, 10];
arr = [...new Set(arr)];
alert(arr);//10,20,30,40