堆排序 js實現


/* 最近 在看c語言版的數據結構,c用法著實很難,于是按照意思,仿照c語言寫了javascript版的三種排序方法!僅供大家一起學習和參考? 后續比較難的歸并排序,和快速排序,以后再說 ,廢話不說,直接邊代碼邊講解!*/var a=[0,9,8,7,6,5,4,3,2,1];

/*希爾排序,

將表分為幾段長度,分別進行排序,然后進行總的排序*/

function shellSort(t)

{

var i,j,temp;

var increment=t.length;

do

{

//取到希爾跳躍 因為js取到的是浮點數,我們要把它轉化成不大于該值得整數

increment=Math.floor(increment/3+1);

for(i=increment;i

{

if(t[i]

temp=t[i];//先將小的數值存儲

for(j=i-increment;j>=0&&temp

t[j+increment]=t[j];//不斷移動,找到這個temp應該插入的位置

}

t[j+increment]=temp;//插入該位置!

}

}

}

while(increment>1)

}

/*

js版插入排序

形如我們打撲克一樣,先取到的撲克牌(數字)作為標準,然后拿到下一個撲克牌(數字),比對前面的數字,將它插入到比前面的撲克牌大,

比后面的數值小的位置,因為前面已經是有序的,只需要從后往前遍歷,把比它大的順序后移一位,空出位置,插到空位

*/

function insert(l){

var temp,len=l.length;

for(var i=1;i

if(l[i]

temp=l[i];

for(var j=i-1;j>=0&&l[j]>temp;j--){

l[j+1]=l[j];

}

l[j+1]=temp;//插到正確位置!此時j指針又向后移動了一位,才跳出循環,所以需要j+1;

}

}

}

/*

堆排序:原理是,將數組看成一個完全二叉樹;

形如:? ? 0

2

4? 5? 6

8 9 10

只需要遍歷一半的值,進行循環比對,把最大的節點賦值到根的位置,然后把根部的值和最后一個數值交換,排除最后一個數值

繼續打造大頂堆,最終形成一個小頂堆的算法!

構造堆排序 s為最小值,m為最大值

*/

function HeapAdjust(l,s,m){//使用調整大頂堆進行排序,將s到m之間的數值調整為大頂堆!

var temp=l[s];//將大頂堆頂值負值給temp;

for(var j=2*s+1;j

{

if(j

++j;

if(temp>=l[j])//如果堆頂的值大于當前j下標的值,就不用再找了。跳出循環

break;

l[s]=l[j];//小于j下標的值,就把l[j]復制給l[s]

s=j;//s就指向當前j的位置,為下步把頂值賦值到這個位置做準備(循環完之前,先不賦值)

}

l[s]=temp;//最后賦值給l[s](s指向現在找到的最大的大堆頂的值)

}

function HeapSort(l)

{

for(var i=l.length/2;i>=0;i--)//首先構造一個標準的大堆頂,只需要便利二叉樹一半的節點,就能夠把大堆頂構造出來

HeapAdjust(l,i,l.length);

for(var i=l.length;i>0;i--){//構造完之后 把堆頂的值和最后一個互換,然后 排除最后一個繼續進行打造大堆頂!

swap(l,0,i-1);

HeapAdjust(l,0,i-2);

}

}

function swap(l,i,j){

var temp=l[i];

l[i]=l[j];

l[j]=temp;

}

shellSort(a);

//insert(a);

console.log(a);

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 概述 排序有內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部...
    蟻前閱讀 5,223評論 0 52
  • 概述:排序有內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,747評論 0 15
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個記錄插入到已排序好...
    依依玖玥閱讀 1,286評論 0 2
  • 總結一下常見的排序算法。 排序分內排序和外排序。內排序:指在排序期間數據對象全部存放在內存的排序。外排序:指在排序...
    jiangliang閱讀 1,391評論 0 1
  • 關鍵詞:韌勁、自我修煉、后手 《如何高效讀懂一本書》174-191 今天看的這部分內容,給自己感觸最深的一方面:就...
    adiep閱讀 196評論 0 0