常用排序方法实现(冒泡排序、选择排序、插入排序、快速排序、sort排序)

冒泡排序

示例:10,2,3,-3,9

第一轮 每轮比较相邻两个数 总共比较 4 次

3 10 4 -3 9
3 4 10 -3 9
3 4 -3 10 9
3 4 -3 9 10

第二轮 总共 3 次 第二个较大值确定

3 4 -3 9 10
3 -3 4 9 10
3 -3 4 9 10

第四轮

总结 n 个数比较 n-1 轮次 每轮进行若干次相邻两数比较

示例:

var arr = [10, 2, 3, 12, 100, 0, -3, 11];
function bubbleSort(arr) {
  // 控制轮数
  for (var i = 0; i < arr.length - 1; i++) {
    // 相邻两个数比较
    for (var j = 0; j < arr.length - 1 - i; j++) {
      if (arr[j] > arr[j + 1]) {
        // 交换位置
        var temp = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = temp;
      }
    }
  }
}
bubbleSort(arr);
console.log(arr);

选择排序

第一轮 第一个位置上的数与后面依次比较,找到最小的

10 3 -3 11 0
3 10 -3 11 0
-3 10 3 11 0
-3 10 3 11 0

第二轮 第二个位置的数与后面依次比较

-3 10 3 11 0
-3 3 10 11 0
-3 3 10 11 0
-3 0 10 11 3

示例:

var arr = [10, 4, 2, 4, 7, 33];
function selectSort(arr) {
  var temp;
  //选择排序
  for (var i = 0; i <= arr.length - 1; i++) {
    for (var j = i + 1; j <= arr.length - 1; j++) {
      if (arr[i] > arr[j]) {
        temp = arr[j];
        arr[j] = arr[i];
        arr[i] = temp;
      }
    }
  }
  return arr;
}
console.log(selectSort(arr));

插入排序

//插入排序
function insertionSort(data) {
  var len = data.length;
  for (var i = 1; i < len; i++) {
    var key = data[i];
    var j = i - 1;
    while (j >= 0 && data[j] > key) {
      data[j + 1] = data[j];
      j--;
    }
    data[j + 1] = key;
  }
  return data;
}

快速排序

function quickSort(arr) {
  var left = [],
    right = [];
  if (arr.length < 1) {
    return arr;
  }
  var index = Math.floor(arr.length / 2); // 向下取整
  var point = arr.splice(index, 1); // 从下标index开始删除1个元素
  for (var i = 0; i < arr.length; i++) {
    if (arr[i] < point) {
      left.push(arr[i]);
    } else {
      right.push(arr[i]);
    }
  }
  return quickSort(left).concat(point, quickSort(right));
}

sort 方法排序

提供比较函数,该函数比较两个值的大小,然后返回一个用于说明这两个值得相对顺序。

比较函数应该具有两个参数 a 和 b,其返回值如下:

若 a<b ,即 a-b 小于零,则返回一个小于零的值,数组将按照升序排列。

若 a=b ,则返回 0。

若 a>b,即 a-b 大于零,则返回一个大于零的值,数组讲按照降序排列。

var array = [1, 80, 4, 33, 21, 55];
array.sort(function (x, y) {
  return x - y; //x-y为升序,y-x为降序
});
/*解释:x,y表示数组中的任意两个元素,若return > 0,则y前x;
  若reutrn < 0 ,则x前y后;
  当x=y时存在浏览器兼容。
  简单来说:就是,x-y是按照从小到大排序,y-x是按照从大到小排序。*/

扩展 —— localeCompare() 方法

返回值

说明比较结果的数字。如果 stringObject 小于 target,则 localeCompare() 返回小于 0 的数。如果 stringObject 大于 target,则该方法返回大于 0 的数。如果两个字符串相等,或根据本地排序规则没有区别,该方法返回 0。

说明

把 < 和 > 运算符应用到字符串时,它们只用字符的 Unicode 编码比较字符串,而不考虑当地的排序规则。以这种方法生成的顺序不一定是正确的。例如,在西班牙语中,其中字符 “ch” 通常作为出现在字母 “c” 和 “d” 之间的字符来排序。

localeCompare() 方法提供的比较字符串的方法,考虑了默认的本地排序规则。ECMAscript 标准并没有规定如何进行本地特定的比较操作,它只规定该函数采用底层操作系统提供的排序规则。

var str;
str.sort(function (a, b) {
  return a.localeCompare(b);
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值