【JS面试题】数组排序,随机打乱数组

一、 顺序排序

  1. 按字符编码(参照ASCII表)排序:sort()
var test1 = ["abc", "acb", "baa", "cgf"];
var test2 = ["-8","-2","1", "2", "10", "5"];
var test3 = [-6,-3,0,2,10,100];
console.log(test1.sort());
console.log(test2.sort());
console.log(test3.sort());

在这里插入图片描述

  1. 将数组元素倒序排:reverse()
var test1 = ["abc","acb","baa","cgf"];
var test2 = ["1","2","10","5"];
var test3 = [1,2,3,4,5,6];
console.log(test1.reverse());
console.log(test2.reverse());
console.log(test3.reverse());

在这里插入图片描述

  1. 在sort()里面加个比较函数
    从小到大
    法一:
//比较函数
function compare(value1,value2) {
    if(value1 < value2) {
        return -1
    }else if(value1 > value2) {
        return 1
    }else{
        return 0
    }
}

let a = [-2,-8,0,4,6,10,200];
//未排序
console.log(a);
//排序 传入比较函数
a.sort(compare);
//排序后 原始数组改变
console.log(a)

在这里插入图片描述
法二:

function compare(a,b) {
    //比较函数return值小于0,则表示a必须出现在b前面,否则在b后面。
    return a - b
}

let a = [-2,-8,0,4,6,10,200];
//未排序
console.log(a);
//排序
a.sort(compare);
//排序后 原始数组改变
console.log(a)

在这里插入图片描述
从大到小:
法一:

//比较函数
function compare(value1,value2) {
    if(value1 < value2) {
        return 1
    }else if(value1 > value2) {
        return -1
    }else{
        return 0
    }
}

let a = [-2,-8,0,4,6,10,200];
//未排序
console.log(a);
//排序  传入比较函数
a.sort(compare);
//排序后 原始数组改变
console.log(a)

在这里插入图片描述
法二:

function compare(a,b) {
    //比较函数return值小于0,则表示b必须出现在a前面,否则在a后面。
    return b - a
}

let a = [-2,-8,0,4,6,10,200];
//未排序
console.log(a);
//排序
a.sort(compare);
//排序后 原始数组改变
console.log(a)

在这里插入图片描述

  1. 快速排序:效率最高
var quickSort = function(arr) {
    if(arr.length <= 1) { return arr; }

    var pivotIndex = Math.floor(arr.length / 2);

    var pivot = arr.splice(pivotIndex, 1)[0];

    var left = [];

    var right = [];

    for(var i = 0; i < arr.length; i++) {
        
        if(arr[i] < pivot) {

             left.push(arr[i]);

        } else {
              
             right.push(arr[i]);

        }

    }

    return quickSort(left).concat([pivot], quickSort(right));
}

var a = [1,5,7,4,-10,20,100];
var b = ["1","3","-2","10","200"];
var c = ["abc", "asd", "bgv", "dge", "oas"];
console.log(quickSort(a)); //从小到大排序
console.log(quickSort(b)); //按照字符编码排序
console.log(quickSort(c)); //按照字符编码排序

在这里插入图片描述

二、 随机排序—乱序

var test = [-3,1,5,10,100,1000];
var a = function() {
    return Math.random() - 0.5
}
test.sort(a);
console.log(test);

在这里插入图片描述
解析:

sort() 方法用于对数组的元素进行排序。sort()方法推荐传入一个函数来定义自己想要的排序规则,函数内会传两个参数,如下图:

PS:sort()方法直接作用于原数组,不产生副本,如不想改变原数组请拷贝一份副本再排序

var test = [1,2,3,4,5];
test.sort(function(a,b) {
    console.log('下一个元素:',a, '当前元素:',b)
})

在这里插入图片描述
a 小于 b,在排序后的数组中a出现在b之前,就返回一个小于0的值

如果a 等于 b,就返回0

如果a 大于 b,就返回一个大于0的值

var test = [1,4,5,2,6,9,3,8];
test.sort(function(a,b) {
    console.log(a - b);
    return a - b
})
console.log(test)

在这里插入图片描述
所以,打乱数组,最简单就是只需要返回随机的正负数

JavaScript中的random()方法返回一个0-1之间的随机数,用随机数-0.5,就可以实现随机返回一个正负数完成乱序

var test = [1,4,5,2,6,9,3,8];
test.sort(function(a,b) {
    console.log(Math.random() - 0.5)
    return Math.random() - 0.5
})
console.log(test)

在这里插入图片描述

PS:

Math.random() 函数

  • 返回一个浮点, 伪随机数在范围从0到小于1,也就是说,从0(包括0)往上,但是不包括1(排除1),然后您可以缩放到所需的范围。实现将初始种子选择到随机数生成算法;它不能被用户选择或重置。
console.log(Math.random());

在这里插入图片描述
Math.round() 函数

  • 返回一个数字四舍五入后最接近的整数。
console.log(Math.round(20.49));
console.log(Math.round(20.5));
console.log(Math.round(-20.5));
console.log(Math.round(-20.51));

在这里插入图片描述
Math.ceil() 函数

  • 返回大于或等于一个给定数字的最小整数。

PS:Math.ceil() === 向上取整

console.log(Math.ceil(.95));

console.log(Math.ceil(4));

console.log(Math.ceil(7.004));

console.log(Math.ceil(-7.004));

在这里插入图片描述
Math.floor() 函数

  • 返回小于或等于一个给定数字的最大整数。

PS:Math.floor() === 向下取整

console.log(Math.floor(45.95));
console.log(Math.floor(4));
console.log(Math.floor(-45.05));
console.log(Math.floor(-45.95));

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43352901/article/details/107580357