亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

javascript中快速穩定的排序算法實現

javascript中快速穩定的排序算法實現

忽然笑 2019-07-30 14:32:42
javascript中快速穩定的排序算法實現我正在尋找一個大約200-300個對象的數組,對特定的鍵和給定的順序(asc / desc)進行排序。結果的順序必須一致且穩定。什么是最好的算法,你能提供一個在javascript中實現它的例子嗎?謝謝!
查看完整描述

3 回答

?
米脂

TA貢獻1836條經驗 獲得超3個贊

我知道這個問題已經回答了一段時間,但我碰巧在我的剪貼板中有一個很好的穩定合并排序實現Array和jQuery,所以我將分享它,希望未來的一些搜索者可能會覺得它很有用。

它允許您像正常Array.sort實現一樣指定自己的比較函數。

履行

// Add stable merge sort to Array and jQuery prototypes// Note: We wrap it in a closure so it doesn't pollute the global//       namespace, but we don't put it in $(document).ready, since it's//       not dependent on the DOM(function() {

  // expose to Array and jQuery
  Array.prototype.mergeSort = jQuery.fn.mergeSort = mergeSort;

  function mergeSort(compare) {

    var length = this.length,
        middle = Math.floor(length / 2);

    if (!compare) {
      compare = function(left, right) {
        if (left < right)
          return -1;
        if (left == right)
          return 0;
        else
          return 1;
      };
    }

    if (length < 2)
      return this;

    return merge(
      this.slice(0, middle).mergeSort(compare),
      this.slice(middle, length).mergeSort(compare),
      compare    );
  }

  function merge(left, right, compare) {

    var result = [];

    while (left.length > 0 || right.length > 0) {
      if (left.length > 0 && right.length > 0) {
        if (compare(left[0], right[0]) <= 0) {
          result.push(left[0]);
          left = left.slice(1);
        }
        else {
          result.push(right[0]);
          right = right.slice(1);
        }
      }
      else if (left.length > 0) {
        result.push(left[0]);
        left = left.slice(1);
      }
      else if (right.length > 0) {
        result.push(right[0]);
        right = right.slice(1);
      }
    }
    return result;
  }})();

示例用法

var sorted = [
  'Finger',
  'Sandwich',
  'sandwich',
  '5 pork rinds',
  'a guy named Steve',
  'some noodles',
  'mops and brooms',
  'Potato Chip Brand? chips'].mergeSort(function(left, right) {
  lval = left.toLowerCase();
  rval = right.toLowerCase();

  console.log(lval, rval);
  if (lval < rval)
    return -1;
  else if (lval == rval)
    return 0;
  else
    return 1;});sorted == ["5 pork rinds", "a guy named Steve", "Finger", "mops and brooms", "Potato Chip Brand? chips", "Sandwich", "sandwich", "some noodles"];


查看完整回答
反對 回復 2019-07-30
  • 3 回答
  • 0 關注
  • 770 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號