js数组排序---自定义快速排序

小鱼儿 2021-09-28 14:54 653阅读 0赞

文章目录

      • js数组自带的sort方法
      • 快速排序
        • 测试一下效率
        • 2020年04月26日 补上对象数组排序

js数组自带的sort方法

  1. var arr = [3, 4, 2, 1];
  2. arr.sort();
  3. console.log(arr);

默认进行递增排序

  1. (4) [1, 2, 3, 4]

sort方法可以接收一个参数,用来自定义排序规则

  1. arr.sort(function(val1, val2){
  2. //return val1 - val2; 默认
  3. return val2 - val1;//倒序。根据结果大于0、小于0、等于零做判断
  4. });

如果数组元素为非数字类型,必须要手动指定排序规则,否则可能会产生诡异的结果。
比如,两个字符串相减结果为NaN,这回导致排序不生效。

当元素为对象时,例

  1. var arr = [{ "a":1},{ "a":311},{ "a":2}];
  2. arr.sort(function(val1, val2){
  3. return val2.a - val1.a;
  4. });
  5. console.log(arr);

经查询资料得知,sort方法竟然是用的冒泡排序。。。换一个效率高些的吧。

快速排序

  1. Array.prototype.sortq = function(_compare){
  2. var _this = this;
  3. if(this.length == 0)
  4. return;
  5. var compare = _compare || function(val1, val2){
  6. return val1 - val2 > 0 ? false : true;
  7. };
  8. function quickSort(src){
  9. _quickSort(src, 0, src.length - 1);
  10. }
  11. function _quickSort(src, left, right){
  12. var key = src[left];
  13. var keyIndex = left;
  14. var i = left;
  15. var j = right;
  16. while(i < j){
  17. while(i < j){
  18. if(compare(_this[j], _this[keyIndex])){
  19. src[keyIndex] = src[j];
  20. src[j] = key;
  21. keyIndex = j;
  22. break;
  23. }
  24. j--;
  25. }
  26. while(i < j){
  27. if(compare(_this[keyIndex], _this[i])){
  28. src[keyIndex] = src[i];
  29. src[i] = key;
  30. keyIndex = i;
  31. break;
  32. }
  33. i++;
  34. }
  35. }
  36. if(left != right){
  37. if(keyIndex != left)
  38. _quickSort(src, left, keyIndex - 1);
  39. if(keyIndex != right)
  40. _quickSort(src, keyIndex + 1, right);
  41. }
  42. }
  43. quickSort(this);
  44. }

测试一下效率

  1. var arr1 = new Array();
  2. for(var i = 0; i < 1000000; i++)
  3. arr1.push(Math.random());
  4. var dat1 = new Date();
  5. arr1.sort();
  6. var dat2 = new Date();
  7. console.log(dat2.getTime() - dat1.getTime());
  8. var arr2 = new Array();
  9. for(var i = 0; i < 1000000; i++)
  10. arr2.push(Math.random());
  11. var dat3 = new Date();
  12. arr2.sortq();
  13. var dat4 = new Date();
  14. console.log(dat4.getTime() - dat3.getTime());

输出

  1. 7237
  2. 292

效率提升了20多倍。虽然还有更高效率的算法,不过这个也够用了。

2020年04月26日 补上对象数组排序

  1. var arr3 = new Array();
  2. for(var i = 0; i < 40; i++){
  3. arr3.push(
  4. {
  5. aa: Math.random()
  6. }
  7. );
  8. }
  9. arr3.sortq(function(val1, val2){
  10. return val1.aa - val2.aa > 0 ? false : true;
  11. });
  12. console.log(arr3);

发表评论

表情:
评论列表 (有 0 条评论,653人围观)

还没有评论,来说两句吧...

相关阅读

    相关 快速排序 js

    快速排序的3个基本步骤: 1. 从数组中选择一个元素作为基准点 2. 排序数组,所有比基准值小的元素摆放在左边,而大于基准值的摆放在右边。每次分割结束以后基准值会插入