我们现在已知有这样一个数组:
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);
金牛区吴迪软件开发工作室博客