JS 数组的排序 sort()方法原理详解

Array.prototype.sort()

sort() 方法用类似Map原地算法对数组的元素进行排序,并返回数组,会改变原数组为排序好的数组。

arr.sort([compareFunction])

该方法传入一个用来进行排序的函数。
如果省略,元素按照转换为的字符串的各个字符的Unicode位来进行排序

const months = ['March', 'Jan', 'Feb', 'Dec'];
months.sort();
console.log(months);
// expected output: Array ["Dec", "Feb", "Jan", "March"]

const array1 = [1, 30, 4, 21, 100000];
array1.sort();
console.log(array1);
// expected output: Array [1, 100000, 21, 30, 4]

但是可以看到,这样子进行的排序,在排序数字类型的时候会出现不稳定性,所以为了稳定的排序数组,我们将传入一个比较函数来达到稳定性排序。

compareFunction 参数:

  • fierstEl

    第一个用来比较的元素

  • secondEl

    第二个用来比较的元素

返回值:排序后的数组

如果传了 compareFunction ,那么数组会按照调用该函数的返回值排序。即 a 和 b 是两个将要被比较的元素:

  • 如果 compareFunction(a, b) return 的结果小于 0 ,那么 a 会被排列到 b 之前;

  • 如果 compareFunction(a, b) return 的结果等于 0 , a 和 b 的相对位置不变。

  • 如果 compareFunction(a, b) return 的结果大于 0 , b 会被排列到 a 之前。

compareFunction(a, b) 必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。

如下,比较函数格式示例:

var items = [
  { name: 'Edward', value: 21 },
  { name: 'Sharpe', value: 37 },
  { name: 'And', value: 45 },
  { name: 'The', value: -12 },
  { name: 'Magnetic' },
  { name: 'Zeros', value: 37 }
];

// 按名字进行降序操作
items.sort(function(a, b) {
  var nameA = a.name.toUpperCase(); // 全部转为大写进行比较
  var nameB = b.name.toUpperCase();  //  可以忽略大小写产生的影响
  if (nameA < nameB) { //如果 nameA 小于 B 则位置不比变
    return -1;
  }
  if (nameA > nameB) {  //  如果name A 大于 B 则B 与 A 交换位置
    return 1;
  }

  // 名字相同时 不变
  return 0;
});

// 按对象的值进行降序
items.sort(function (a, b) {
  if(a < b){  //  a < b 则 把小的 a 放前
        return -1
   }
});

比较数字非字符串,比较函数可以简单的以 a 减 b,如下的函数会将数组升序排列(降序则为 b 减 a)

var numbers = [4, 2, 5, 1, 3];
/*
	一开始 4-2 =2 return大于0的数  b(较小的数)会往前 a(较大的数)会往后,
	然后第二次 4 - 5 = -1 return小于0的数,则 a(较小的数)往前,b(教大的数)往后
	后面一次按此把小的数往前排最后完成升序排序
*/ 
numbers.sort((a, b) => a - b);
console.log(numbers);
// [1, 2, 3, 4, 5]

// 遇到小的数(b) 减去 大的数(a) 不会变位置 b-a 小于0 (a,b)位置不变
// 遇到大的数(b) 减去 小的数(a) b-a 大于0 ,(a,b) 大的往前放,小往后,最后成降序排序
numbers.sort((a, b) => b - a);
console.log(numbers);
// [5, 4, 3, 2, 1]

使用 sort 方法解题

调整数组顺序使奇数位于偶

JS 数组的排序 sort()方法原理详解_第1张图片

var exchange = function(nums) {
	/*
	奇数在后,偶数在前,使 b % 2(奇数) - a % 2(偶数)大于0  b(奇数)往前 a(偶数) 往后
	奇数在前,偶数在后,使 b % 2 (偶数)- a % 2(奇数)小于0 a,b位置不变依然保持 前奇数,后偶数
	最后依次将 奇数排在前,偶数排在后
	*/ 
    return nums.sort((a, b) => b % 2 - a % 2);
};

把数组排成最小的数(中等)

JS 数组的排序 sort()方法原理详解_第2张图片

var minNumber = function(nums) {
    if(nums.length == 0) return null
    // 3 30 直接比的话输出是 330 要字符串相加后再比大小变成 303这样才是最小的
    return nums.sort((a,b)=>((a+'') + (b+'') -0) - ( (b+'') + (a+'') -0 )).join('')
};

你可能感兴趣的:(javascript,排序算法,开发语言)