数组排序,求数组最大值,最小值的方法

我们现在已知有这样一个数组:

let array = [51,4,95,32,-64,8,125];

接下来我们要对其进行排序,求最大值和最小值:


首先先来数组排序的方法:

1.数组的sort排序方法:
注意点:

  • 数组的sort方法会改变原有数组
array.sort((a, b) => a - b;)	//升序
array.sort((a, b) => b - a;)	//降序

2.冒泡排序方法:
计算的逻辑:

  • 比较相邻的元素。如果第一个比第二个大,就交换他们俩个位置。
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  • 针对所有的元素重复以上的步骤,除了最后一个。
  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
for(let i = 0; i < array.length - 1; i++){//控制比较轮数
   for(let j = 0; j < array.length-i-1; j++){//控制每轮比较的次数
        if(array[j] > array[j+1]){
            var tmp = array[j];
            array[j] = array[j+1];
            array[j+1]=tmp;
        }
    }
}

3.快速排序的方法:
计算的逻辑:

  • 递归思想,俩边快速的排序,冒泡排序的改进
function quickSort(arr) {
 //如果数组长度小于等于1,则返回数组本身
    if(arr.length <= 1){
        return arr;
    }
    //定义中间值的索引
    let index = Math.floor(arr.length/2);
    //取到中间值
    let temp = arr.splice(index,1);
    //定义左右部分数组
    let left = [];
    let right = [];
    for(let i = 0; i < arr.length; i++){
        //如果元素比中间值小,那么放在左边,否则放在右边
        if(arr[i] < temp) {
            left.push(arr[i]);
        } else {
            right.push(arr[i]);
        }
    }
    return quickSort(left).concat(temp,quickSort(right));
}
array = quickSort(array);

3.插入排序
注意点:

  • 此定义方法会改变原有数组
    计算的逻辑:
  • 从第一个元素开始,该元素可以认为已经被排序
  • 取出下一个元素,在已经排序的元素序列中扫描
  • 如果该元素(已排序)大于新元素,将该元素移到下一位置
  • 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
  • 将新元素插入到下一位置中
  • 重复步骤2
function insertSort(arr) {
   //假设第0元素是有序序列,第1元素之后是无序的序列。从第1元素开始依次将无序的序列元素插入到有序的序列中
    for(let i = 1; i < arr.length; i++) {
        if(arr[i] < arr[i - 1]) {
            //取出无序序列中需要插入的第i个元素
            let temp = arr[i];
            //定义有序中的最后一个位置
            let j = i - 1;
            arr[i] = arr[j];
            //比较大小,找到插入的位置
            while(j >= 0 && temp < arr[j]) {
                arr[j + 1] = arr[j];
                j--;
            };
            //插入
            arr[j + 1] = temp;
        }
    }
}
insertSort(array);

4.选择排序
注意点:

  • 此自定义方法会改变原有数组
    计算的逻辑:
  • 在未排序序列中找到最小(大)元素
  • 并存放到排序序列的起始位置
  • 然后,再把剩余未排序元素中继续寻找最小(大)元素
  • 然后放到已排序序列的末尾
  • 依此类推
function selectSort(arr) {
   for(let i = 0; i < arr.length; i++) {
        //设置当前范围最小值和索引
        let min = arr[i];
        let minIndex = i;
        //在该范围选出最小值
        for(let j = i + 1; j < arr.length; j++) {
            if(min > arr[j]) {
                min = arr[j];
                minIndex = j;
            }
        }
        //将最小值插入,并将原来位置的最小值删除
        arr.splice(i, 0, min);
        arr.splice(minIndex + 1, 1);
    }
}
selectSort(array);

接下来讲求数组最大值和最小值的方法:

1.排序法:
根据上面排序好的数组去查找就可以了
按升序排序好的数组[0] 就是当前数组的最小值
按升序排序好的数组[length - 1] 就是当前数组的最大值

2.假设法:
假设当前数组的第一个值是最大值或者最小值,然后拿这个值去和后面的逐一比较,如果假设不成立,那么就拿当前遍历到的值去替换当前值。

let max = array[0];	//求最大值
let min = array[0];	//求最小值
for (let i = 1; i < array.length; i++) {
	if (array[i] > max) {	//求最大值的假设
		max = array[i];
	}
	if (array[i] < min) {	//求最小值的假设
		min = array[i];
	}
}

3.Math的max和min方法

let max = Math.max.apply(null, array);
let min = Math.min.apply(null, array);

4.ES6中的拓展运算符

let max = Math.max(...array);
let min = Math.min(...array);

你可能感兴趣的:(吴小迪专栏之原生JS)