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

資訊專欄INFORMATION COLUMN

算法筆記(JavaScript版)——排序

ctriptech / 843人閱讀

摘要:算法筆記版排序本文內(nèi)容根據(jù)和的算法第四版整理,原代碼為語(yǔ)言,自己修改為版本,僅供參考。希爾排序的思想是使數(shù)組中任意間隔為的元素都是有序的。使用遞增序列,,,,,的希爾排序所需的比較次數(shù)不會(huì)超過(guò)的若干倍乘以遞增序列的長(zhǎng)度。

算法筆記(JavaScript版)——排序 本文內(nèi)容根據(jù)Rebert Sedgewick和Kevin Wayne的《算法(第四版)》整理,原代碼為java語(yǔ)言,自己修改為JavaScript版本,僅供參考。 排序算法模版
function sort(arr){
  //此處添加不同的排序算法實(shí)現(xiàn)
}
//比較兩個(gè)數(shù)的大小
function less(a, b){
  return a < b
} 
//交換數(shù)組中兩個(gè)數(shù)的位置
function exch(arr, i, j){
  var temp = arr[i];
  arr[i] = arr[j];
  arr[j] = temp;
}
//判斷數(shù)組是否是有序的
function isSorted(arr){
  var len = arr.length;
  for(var i = 1; i < len; i++){
    if(less(arr[i], arr[j])){
      return false;
    }
  }
  return true;
}

?

選擇排序

對(duì)于長(zhǎng)度為N的數(shù)組,選擇排序需要大約(N^2/2)次比較和N次交換

運(yùn)行時(shí)間和輸入無(wú)關(guān)(僅與輸入的長(zhǎng)度有關(guān))

數(shù)據(jù)移動(dòng)是最少的

function selectionSort(arr){
  var len = arr.length;
  for(var i = 0; i < len; i++){
    var min = i;
    for(var j = i+1; j < len; j++){
      if(less(arr[j], arr[min])){
        min = j;
      }      
    }
    exch(arr, i, min)
  }
}

?

插入排序

插入排序所需的時(shí)間依賴于輸入中元素的初始順序。

對(duì)于隨機(jī)排列的長(zhǎng)度為N且主鍵不重復(fù)的數(shù)組,平局情況下插入排序需要~(N^2/4)次比較和~(N^2/4)次交換。最壞情況下需要~(N^2/2)次比較和~(N^2/4)次交換,最好情況下需要(N-1)次比較和0次交換。

插入排序?qū)τ诓糠钟行虻臄?shù)組很有效,下面是幾種典型的部分有序的數(shù)組:

數(shù)組中每個(gè)元素距離它最終的位置都不遠(yuǎn)。

一個(gè)有序的大數(shù)組接一個(gè)小數(shù)組。

數(shù)組中只有幾個(gè)元素的位置不正確。

function insertionSort(arr){
  var len = arr.length;
  for(var i = 1; i < len; i++){
    for(var j = i; j > 0; j--){
      if(less(arr[j], arr[j-1])){
        exch(arr, j, j-1)
      }
    }
  }
}

?

希爾排序

希爾排序是基于插入排序的快速排序算法。

希爾排序的思想是:使數(shù)組中任意間隔為h的元素都是有序的。這樣的數(shù)組被稱為h有序數(shù)組。在進(jìn)行排序時(shí),如果h很大,我們就能將元素移動(dòng)到很遠(yuǎn)的地方,為實(shí)現(xiàn)更小的h有序創(chuàng)造方便。

使用遞增序列1,4,13,40,121,364…的希爾排序所需的比較次數(shù)不會(huì)超過(guò)N的若干倍乘以遞增序列的長(zhǎng)度。

function shellSort(arr){
  var len = arr.length,
      h = 1;
  while(h < len/3){
    h = 3*h+1;
  }
  while(h >=1){
    for(var i = h; i < len; i++){
      for(var j = i; j >= h; j-=h){
        if(less(arr[j], arr[j-h])){
          exch(arr, j, j-h)
        }
      }
    }
    h = (h-1)/3;
  }
}

?

歸并排序

要將一個(gè)數(shù)組排序,可以先(遞歸地)將它分成兩半分別排序,然后將結(jié)果歸并起來(lái)。

歸并排序最吸引人的性質(zhì)是它能夠保證將任意長(zhǎng)度為N的數(shù)組排序所需時(shí)間和NlogN成正比,主要缺點(diǎn)是它所需的額外空間和N成正比。

//原地歸并的抽象方法
function merge(arr, lo, mid, hi){
  var aux = [],
      i = lo,
      j = mid+1;
  for(var k = lo; k <= hi; k++){
    aux[k] = arr[k]
  }
  
  for(var m = lo; m <= hi; m++){
    if(i > mid){
      arr[m] = aux[j++];
    }else if(j > hi){
      arr[m] = aux[i++];
    }else if(less(aux[j], aux[i])){
      arr[m] = aux[j++];
    }else{
      arr[m] = aux[i++];
    }
  }  
}
//自頂向下的歸并排序
function mergeSort(arr, lo, hi){
  if(hi <= lo){
    return;
  }
  var mid = Math.floor(lo + (hi - lo)/2);
  mergeSort(arr, lo, mid);
  mergeSort(arr, mid+1, hi);
  merge(arr, lo, mid, hi);
}

對(duì)于長(zhǎng)度為N的任意數(shù)組,自頂向下的歸并排序需要(1/2)NlgNNlgN次比較。

對(duì)于長(zhǎng)度為N的任意數(shù)組,自頂向下的歸并排序最多需要訪問(wèn)數(shù)組6NlgN次。

通過(guò)一些細(xì)致的思想可以大幅度縮短歸并排序的運(yùn)行時(shí)間:

對(duì)小規(guī)模子數(shù)組使用插入排序

測(cè)試數(shù)組是否已經(jīng)有序

不將元素復(fù)制到輔助數(shù)組

//自底向上的歸并排序
function mergeSortBU(arr){
  var len = arr.length;
  for(var sz = 1; sz < len; sz = sz+sz){
    for(var lo = 0; lo < len-sz; lo += sz+sz){
      merge(arr, lo, lo+sz-1, Math.min(lo+sz+sz-1, len-1));
    }
  }
}

對(duì)于長(zhǎng)度為N的任意數(shù)組,自底向上的歸并排序需要(1/2)NlgNNlgN次比較,最多訪問(wèn)數(shù)組6NlgN次。

當(dāng)數(shù)組長(zhǎng)度為2的冪時(shí),自頂向下和自底向上的歸并排序所用的比較次數(shù)和數(shù)組訪問(wèn)次數(shù)相同,其他時(shí)候兩種方法的比較和數(shù)組訪問(wèn)次序會(huì)有所不同。

自底向上的歸并排序比較適合用鏈表組織的數(shù)據(jù)。

?

快速排序

快速排序是一種分治的排序算法。

將長(zhǎng)度為N的無(wú)重復(fù)數(shù)組排序,快速排序平均需要(~2NlnN)次比較(以及1/6的交換)

快速排序最多需要約(N^2/2)次比較,但隨機(jī)打亂數(shù)組能夠預(yù)防這種情況。

//快速排序
function quickSort(arr, lo, hi){
  if(hi <= lo){
    return;
  }
  var j = partition(arr, lo, hi);
  quickSort(arr, lo, j-1);
  quickSort(arr, j+1, hi);
}
//快速排序的切分
function partition(arr, lo, hi){
  var i = lo,
      j = hi + 1,
      v = arr[lo];
  while(true){
    while(less(arr[++i], v)){
      if(i === hi){
        break;
      }
    }
    while(less(v, arr[--j])){
      if(j === lo){
        break;
      }
    }
    if(i >= j){
      break;
    }
    exch(arr, i, j);
  }
  exch(arr, lo, j);
  return j;    
}

快速排序改進(jìn)方法:

切換到插入排序

//快速排序
function quickSort(arr, lo, hi){
  //if(hi <= lo){
  //  return;
  //}
  if(hi <= lo + M){
  //轉(zhuǎn)換參數(shù)M的最佳值與系統(tǒng)相關(guān)
  //大多數(shù)情況下5~15之間的任意值都能令人滿意
    insertionSort(arr, lo, hi);
    return;
  }
  var j = partition(arr, lo, hi);
  quickSort(arr, lo, j-1);
  quickSort(arr, j+1, hi);
}

三取樣切分,使用子數(shù)組的一小部分元素的中位數(shù)來(lái)切分?jǐn)?shù)組

熵最優(yōu)的排序

對(duì)于存在大量重復(fù)元素的數(shù)組,三向切分的快速排序比標(biāo)準(zhǔn)的快速排序的效率高得多。

對(duì)于大小為N的數(shù)組,三向切分的快速排序需要~(2ln2)NH次比較,其中H為由主鍵值出現(xiàn)頻率定義的香農(nóng)信息量。

//三向切分的快速排序
function quick3WaySort(arr, lo, hi){
  if(hi <= lo){
    return;
  }
  var lt = lo,
      i = lo + 1,
      gt = hi;
  var v = arr[lo];
  while(i <= gt){
    if(less(arr[i], v)){
      //arr[i]小于v時(shí),交換arr[lt]和arr[i],將lt和i加1
      exch(arr, lt++, i++);
    }else if(less(v, arr[i])){
      //arr[i]大于v時(shí),交換arr[i]和arr[gt],將gt減1
      exch(arr, i, gt--);
    }else{
      //arr[i]等于v時(shí),將i加1
      i++;
    }
  }
  quick3WaySort(arr, lo, lt-1);
  quick3WaySort(arr, gt+1, hi);
}

?

?

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

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

相關(guān)文章

  • javaScript排序算法學(xué)習(xí)筆記

    摘要:排序算法學(xué)習(xí)筆記用于創(chuàng)建數(shù)組冒泡排序冒泡排序比較任何兩個(gè)相鄰的項(xiàng),如果第一個(gè)比第二個(gè)大,則交換它們。歸并排序歸并排序是一種分治算法。完成下列操作的前提是數(shù)組均已經(jīng)完成。 javaScript排序算法學(xué)習(xí)筆記 // 用于創(chuàng)建數(shù)組 function createNonSortedArray(size) { var array = new ArrayList(); for( ...

    lentoo 評(píng)論0 收藏0
  • JavaScript學(xué)習(xí)筆記 - 基礎(chǔ)排序算法

    摘要:本文記錄了我在學(xué)習(xí)前端上的筆記,方便以后的復(fù)習(xí)和鞏固。冒泡排序算法步驟比較相鄰的元素。這步做完后,最后的元素會(huì)是最大的數(shù)。重復(fù)第二步,直到所有元素均排序完畢。得到序列第二趟,,和進(jìn)行交換。 本文記錄了我在學(xué)習(xí)前端上的筆記,方便以后的復(fù)習(xí)和鞏固。推薦大家去看看這一本gitBook上的書(shū)十大經(jīng)典排序算法本文就是看這本書(shū)記錄的筆記。 冒泡排序 1.算法步驟 1.比較相鄰的元素。如果第一個(gè)比第...

    mindwind 評(píng)論0 收藏0
  • 優(yōu)秀程序員都應(yīng)該學(xué)習(xí)的 GitHub 上開(kāi)源的數(shù)據(jù)結(jié)構(gòu)與算法項(xiàng)目

    摘要:強(qiáng)烈推薦上值得前端學(xué)習(xí)的數(shù)據(jù)結(jié)構(gòu)與算法項(xiàng)目,包含圖的演示過(guò)程與視頻講解。該倉(cāng)庫(kù)包含了多種基于的算法與數(shù)據(jù)結(jié)構(gòu),提供進(jìn)一步閱讀的解釋和鏈接。數(shù)據(jù)結(jié)構(gòu)和算法必知必會(huì)的個(gè)代碼實(shí)現(xiàn)。 showImg(https://segmentfault.com/img/bVbvpYZ); 前言 算法為王。想學(xué)好前端,先練好內(nèi)功,內(nèi)功不行,就算招式練的再花哨,終究成不了高手;只有內(nèi)功深厚者,前端之路才會(huì)走得...

    cheukyin 評(píng)論0 收藏0
  • 【程序員必備】知識(shí)點(diǎn) 持續(xù)更新

    TCP/IP HTTP和HTTPS有何區(qū)別? httpbin 一個(gè)簡(jiǎn)單的HTTP請(qǐng)求和響應(yīng)服務(wù)。 TCP的三次握手與四次揮手 通俗易懂版,詳細(xì)版本 MySQL CHAR和VARCHAR存取的差別 《高性能MySQL》筆記 - MySQL 鎖的基本類型 MySQL中的鎖之一:鎖的必要性及分類 MySQL中的鎖之二:行鎖、頁(yè)鎖、表鎖 MySQL Like與Regexp的區(qū)別 數(shù)據(jù)結(jié)構(gòu) 數(shù)...

    hellowoody 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

ctriptech

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<