成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

ts/js歸并排序?qū)崿F(xiàn)(穩(wěn)定排序)

vvpvvp / 550人閱讀

摘要:穩(wěn)定排序穩(wěn)定排序是指,如果原數(shù)組中有多個元素是相等的,那么這些元素在排序后數(shù)組的相對順序應(yīng)該保持不變。實現(xiàn)歸并排序穩(wěn)定排序。的參數(shù)必須為數(shù)組排序范圍順序已經(jīng)正確歸并排序穩(wěn)定排序。

穩(wěn)定排序

穩(wěn)定排序是指,如果原數(shù)組中有多個元素是“相等的”,那么這些元素在排序后數(shù)組的相對順序應(yīng)該保持不變。
比如:我們對{name:string, age:number}[]數(shù)組用age進(jìn)行排序,有很多人是25歲,那么在排序后的數(shù)組中,這些25歲的人應(yīng)該按照它們【在原數(shù)組中出現(xiàn)的順序】來排列。

原生的sort是不一定是穩(wěn)定的,因為不同的引擎實現(xiàn)不同,比如V8的sort就用到快排,快排不是穩(wěn)定的排序。

為什么需要穩(wěn)定的排序?其中一種情況是:原列表已經(jīng)在某個字段上排好序,然而要排序的字段上可能有很多項是“相等”的。
比如有一個{name:string, age:number}[]數(shù)組,它【已經(jīng)在name上按照字母順序排好序】了,現(xiàn)在希望按照age來排序。假設(shè)有很多人的age是25,如果排序是穩(wěn)定的話,就能保證這些25歲的人【在輸出列表中是按照字母順序排列的】,這樣的話輸出的列表會好看很多。

實現(xiàn) typescript
/**
 * @description 歸并排序(穩(wěn)定排序)。
 * 此方法會改變原數(shù)組,如果不想破壞原數(shù)組,調(diào)用者自己創(chuàng)建數(shù)組副本作為參數(shù)。
 */
function mergeSort(arr: T[], compare: (a: T, b: T) => -1 | 0 | 1): T[] {
  if (!Array.isArray(arr)) {
    throw new Error("mergeSort的參數(shù)必須為數(shù)組");
  }
  _ms(arr, compare, 0, arr.length);
  return arr;
}

/**
 * @description 排序范圍:[begin, end)
 */
function _ms(arr: T[], compare: (a: T, b: T) => -1 | 0 | 1, begin: number, end: number): void {
  const size = end - begin;
  if (size <= 1) { return; }
  // tslint:disable-next-line: no-bitwise
  const middle = (end + begin) >> 1;
  _ms(arr, compare, begin, middle);
  _ms(arr, compare, middle, end);
  if (compare(arr[middle - 1], arr[middle]) <= 0) { return; } // 順序已經(jīng)正確
  const merged = [];
  let leftIndex = begin, rightIndex = middle;
  while (merged.length < size) {
    if (leftIndex === middle) {
      merged.push(arr[rightIndex++]);
    } else if (rightIndex === end) {
      merged.push(arr[leftIndex++]);
    } else {
      const c = compare(arr[leftIndex], arr[rightIndex]);
      if (c <= 0) {
        merged.push(arr[leftIndex++]);
      } else {
        merged.push(arr[rightIndex++]);
      }
    }
  }
  arr.splice(begin, size, ...merged);
}
JavaScript
/**
 * @description 歸并排序(穩(wěn)定排序)。
 * 此方法會改變原數(shù)組,如果不想破壞原數(shù)組,調(diào)用者自己創(chuàng)建數(shù)組副本作為參數(shù)。
 */
function mergeSort(arr, compare) {
    if (!Array.isArray(arr)) {
        throw new Error("mergeSort的參數(shù)必須為數(shù)組");
    }
    _ms(arr, compare, 0, arr.length);
    return arr;
}
/**
 * @description 排序范圍:[begin, end)
 */
function _ms(arr, compare, begin, end) {
    var size = end - begin;
    if (size <= 1) {
        return;
    }
    // tslint:disable-next-line: no-bitwise
    var middle = (end + begin) >> 1;
    _ms(arr, compare, begin, middle);
    _ms(arr, compare, middle, end);
    if (compare(arr[middle - 1], arr[middle]) <= 0) { return; } // 順序已經(jīng)正確
    var merged = [];
    var leftIndex = begin, rightIndex = middle;
    while (merged.length < size) {
        if (leftIndex === middle) {
            merged.push(arr[rightIndex++]);
        }
        else if (rightIndex === end) {
            merged.push(arr[leftIndex++]);
        }
        else {
            var c = compare(arr[leftIndex], arr[rightIndex]);
            if (c <= 0) {
                merged.push(arr[leftIndex++]);
            }
            else {
                merged.push(arr[rightIndex++]);
            }
        }
    }
    arr.splice(begin, size, ...merged);
}
測試

去leetcode上找一道能用排序的題測試,比如75. Sort Colors(雖然說這道題不用排序效率更高)。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/94411.html

相關(guān)文章

  • 排序之八大絕技

    摘要:需要注意的是排升序要建大堆,排降序建小堆。應(yīng)用場景需要前個最大或最小元素時,或者與其他排序一塊使用五冒泡排序排序思想大的元素向下沉,小的元素向上浮。 目錄 一.插入排序 1.插入排序思想 2.動態(tài)圖形演示 ?3.插排思路與圖解 4.插入排序代碼實現(xiàn)(升序) 5.時間復(fù)雜度,空間復(fù)雜度及穩(wěn)定...

    Vixb 評論0 收藏0
  • 數(shù)據(jù)結(jié)構(gòu)與算法——希爾、歸并、快速排序

    摘要:今天再來看看另外三種時間復(fù)雜度都是的排序算法,分別是希爾排序歸并排序和快速排序。三數(shù)取中法求將放到數(shù)組的末尾總結(jié)這三種排序算法的平均時間復(fù)雜度都是,歸并排序和快速排序的應(yīng)用更廣泛。 1. 回顧 前面說完了三種較為簡單的排序算法,分別是冒泡排序,選擇排序和插入排序,它們的平均情況時間復(fù)雜度都是 O(n2),比較的高,適合小規(guī)模的數(shù)據(jù)排序,其中插入排序的效率稍高,所以更推薦使用插入排序。今...

    hersion 評論0 收藏0
  • JavaScript 數(shù)據(jù)結(jié)構(gòu)與算法之美 - 歸并排序、快速排序、希爾排序、堆排序

    摘要:之所以把歸并排序快速排序希爾排序堆排序放在一起比較,是因為它們的平均時間復(fù)雜度都為。歸并排序是一種穩(wěn)定的排序方法。因此,快速排序并不穩(wěn)定。希爾排序思想先將整個待排序的記錄序列分割成為若干子序列。 showImg(https://segmentfault.com/img/bVbvpYZ?w=900&h=250); 1. 前言 算法為王。 想學(xué)好前端,先練好內(nèi)功,只有內(nèi)功深厚者,前端之路才...

    haitiancoder 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<