JavaScript數(shù)據(jù)結構26—希爾炭庙,堆先嬉,快速,歸并排序

希爾和堆排序

//希爾排序(插入)
Array.prototype.shellSort = function(){
  var increment = this.length;
  console.info('初始化步長:'+increment);
  var temp,j;
  do{
    increment = parseInt(increment/3)+1;
    console.info('步長變?yōu)椋?+increment);
    for (var i = increment; i < this.length; i++) {
      console.info('對比 第'+i+'個元素:'+this[i]+',第'+(i-increment)+'個元素:'+
        this[i-increment]);
      if(this[i]<this[i-increment]){
        temp = this[i];
        for(j = i-increment;j>=0&&temp<this[j];j-=increment){
          console.info('賦值 第'+(j+increment)+'個元素'+this[j+increment]
            +'賦值為第'+j+'元素'+this[j]);
          this[j+increment] = this[j];
        }
        this[j+increment] = temp;
        console.info('賦值 第'+(j+increment)+'個元素'+this[j+increment]
          +'賦值為第'+i+'元素'+temp);
      }
    }
  }
  while(increment>1);
}
//堆排序
//調整函數(shù)
Array.prototype.headAdjust = function(pos, len){
  //將當前節(jié)點值進行保存
  var swap = this[pos];
  //定位到當前節(jié)點的左邊的子節(jié)點
  var child = pos * 2 + 1;
  //遞歸光督,直至沒有子節(jié)點為止
  while(child < len){
    //如果當前節(jié)點有右邊的子節(jié)點阳距,并且右子節(jié)點較大的場合,采用右子節(jié)點
    //和當前節(jié)點進行比較
    if(child + 1 < len && this[child] < this[child + 1]){
      child += 1;
    }
    //比較當前節(jié)點和最大的子節(jié)點结借,小于則進行值交換筐摘,交換后將當前節(jié)點定位
    //于子節(jié)點上
    if(this[pos] < this[child]){
      this[pos] = this[child];
      pos = child;
      child = pos * 2 + 1;
    }
    else{
      break;
    }
    this[pos] = swap;
  }
}

//構建堆
Array.prototype.buildHeap = function(){
  //從最后一個擁有子節(jié)點的節(jié)點開始,將該節(jié)點連同其子節(jié)點進行比較船老,
  //將最大的數(shù)交換與該節(jié)點,交換后咖熟,再依次向前節(jié)點進行相同交換處理,
  //直至構建出大頂堆(升序為大頂努隙,降序為小頂)
  for(var i=parseInt(this.length/2); i>=0; i--){
    this.headAdjust(i, this.length);
  }
}

Array.prototype.heapSort = function(){
  //構建堆
  this.buildHeap();
  //從數(shù)列的尾部開始進行調整
  for(var i=this.length-1; i>0; i--){
    //堆頂永遠是最大元素球恤,故,將堆頂和尾部元素交換荸镊,將
    //最大元素保存于尾部咽斧,并且不參與后面的調整
    var swap = this[i];
    this[i] = this[0];
    this[0] = swap;
    //進行調整,將最大)元素調整至堆頂
    this.headAdjust(0, i);
  }
}
var a1 = [3, 1, 5, 7, 2, 4, 9, 6, 10, 8];
console.log('希爾排序before: ' + a1);
a1.shellSort();
console.log('希爾排序after: ' + a1);
var a2 = [3, 1, 5, 7, 2, 4, 9, 6, 10, 8];
console.log('堆排序before: ' + a2);
a2.heapSort();
console.log('堆排序after: ' + a2);

希爾排序before: 3,1,5,7,2,4,9,6,10,8
初始化步長:10
步長變?yōu)椋?
對比 第4個元素:2,第0個元素:3
賦值 第4個元素2賦值為第0元素3
賦值 第0個元素2賦值為第4元素2
對比 第5個元素:4,第1個元素:1
對比 第6個元素:9,第2個元素:5
對比 第7個元素:6,第3個元素:7
賦值 第7個元素6賦值為第3元素7
賦值 第3個元素6賦值為第7元素6
對比 第8個元素:10,第4個元素:3
對比 第9個元素:8,第5個元素:4
步長變?yōu)椋?
對比 第2個元素:5,第0個元素:2
對比 第3個元素:6,第1個元素:1
對比 第4個元素:3,第2個元素:5
賦值 第4個元素3賦值為第2元素5
賦值 第2個元素3賦值為第4元素3
對比 第5個元素:4,第3個元素:6
賦值 第5個元素4賦值為第3元素6
賦值 第3個元素4賦值為第5元素4
對比 第6個元素:9,第4個元素:5
對比 第7個元素:7,第5個元素:6
對比 第8個元素:10,第6個元素:9
對比 第9個元素:8,第7個元素:7
步長變?yōu)椋?
對比 第1個元素:1,第0個元素:2
賦值 第1個元素1賦值為第0元素2
賦值 第0個元素1賦值為第1元素1
對比 第2個元素:3,第1個元素:2
對比 第3個元素:4,第2個元素:3
對比 第4個元素:5,第3個元素:4
對比 第5個元素:6,第4個元素:5
對比 第6個元素:9,第5個元素:6
對比 第7個元素:7,第6個元素:9
賦值 第7個元素7賦值為第6元素9
賦值 第6個元素7賦值為第7元素7
對比 第8個元素:10,第7個元素:9
對比 第9個元素:8,第8個元素:10
賦值 第9個元素8賦值為第8元素10
賦值 第8個元素10賦值為第7元素9
賦值 第7個元素8賦值為第9元素8
希爾排序after: 1,2,3,4,5,6,7,8,9,10
堆排序before: 3,1,5,7,2,4,9,6,10,8
堆排序after: 1,2,3,4,5,6,7,8,9,10
[Finished in 0.1s]

快速排序

function quickSort(arr){
    //如果數(shù)組<=1,則直接返回
    if(arr.length<=1){
        return arr;
    }
    var pivotIndex=Math.floor(arr.length/2);
    //找基準躬存,并把基準從原數(shù)組刪除
    var pivot=arr.splice(pivotIndex,1)[0];
    //定義左右數(shù)組
    var left=[];
    var right=[];
    //比基準小的放在left张惹,比基準大的放在right
    for(var i=0;i<arr.length;i++){
        if(arr[i]<=pivot){
            left.push(arr[i]);
        }
        else{
        right.push(arr[i]);
        }
    }
    //遞歸
    return quickSort(left).concat([pivot],quickSort(right));
}
var a1 = [3, 1, 5, 7, 2, 4, 9, 6, 10, 8];
console.log('排序before: ' + a1);
a1 = quickSort(a1);
console.log('排序after: ' + a1);

排序before: 3,1,5,7,2,4,9,6,10,8
排序after: 1,2,3,4,5,6,7,8,9,10

歸并排序

function merge(left,right) {
    var result = [];
    while(left.length>0&&right.length>0){
        if(left[0]<right[0]){
            result.push(left.shift());
        }else{
            result.push(right.shift());
        }
    }
    return result.concat(left).concat(right);
}
function mergeSort(arr){
    if(arr.length==1){
        return arr;
    }
    var mid = Math.floor(arr.length/2);
    var left = arr.slice(0,mid);
    var right = arr.slice(mid);
    return merge(mergeSort(left),mergeSort(right))
}
var a1 = [3, 1, 5, 7, 2, 4, 9, 6, 10, 8];
console.log('排序before: ' + a1);
a1 = mergeSort(a1);
console.log('排序after: ' + a1);

排序before: 3,1,5,7,2,4,9,6,10,8
排序after: 1,2,3,4,5,6,7,8,9,10
[Finished in 0.1s]

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市岭洲,隨后出現(xiàn)的幾起案子宛逗,更是在濱河造成了極大的恐慌,老刑警劉巖盾剩,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雷激,死亡現(xiàn)場離奇詭異替蔬,居然都是意外死亡,警方通過查閱死者的電腦和手機屎暇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進店門承桥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人根悼,你說我怎么就攤上這事凶异。” “怎么了挤巡?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵剩彬,是天一觀的道長。 經(jīng)常有香客問我矿卑,道長喉恋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任粪摘,我火速辦了婚禮瀑晒,結果婚禮上,老公的妹妹穿的比我還像新娘徘意。我一直安慰自己苔悦,他們只是感情好,可當我...
    茶點故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布椎咧。 她就那樣靜靜地躺著玖详,像睡著了一般。 火紅的嫁衣襯著肌膚如雪勤讽。 梳的紋絲不亂的頭發(fā)上蟋座,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天,我揣著相機與錄音脚牍,去河邊找鬼向臀。 笑死,一個胖子當著我的面吹牛诸狭,可吹牛的內容都是我干的券膀。 我是一名探鬼主播,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼驯遇,長吁一口氣:“原來是場噩夢啊……” “哼芹彬!你這毒婦竟也來了?” 一聲冷哼從身側響起叉庐,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤舒帮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體玩郊,經(jīng)...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡肢执,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了瓦宜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蔚万。...
    茶點故事閱讀 38,687評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡岭妖,死狀恐怖临庇,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情昵慌,我是刑警寧澤假夺,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布,位于F島的核電站斋攀,受9級特大地震影響已卷,放射性物質發(fā)生泄漏。R本人自食惡果不足惜淳蔼,卻給世界環(huán)境...
    茶點故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一侧蘸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鹉梨,春花似錦讳癌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至旦袋,卻和暖如春骤菠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背疤孕。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工商乎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人祭阀。 一個月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓鹉戚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親柬讨。 傳聞我的和親對象是個殘疾皇子崩瓤,可洞房花燭夜當晚...
    茶點故事閱讀 43,576評論 2 349

推薦閱讀更多精彩內容