複習了一下資料結構的排序演算法,一年之前學的東西,現在拿來練習時,感慨挺多的。
寫在前面的話
可能馬上就要面試了,我還是有點慌的,今天看了資料結構的排序,並嘗試著用js來寫了一下,雖然沒有什麼實際的意義,但還是有點個人的理解和感悟和大家分享:有人說程式設計的世界就是資料結構和演算法,我覺得並不是。更確切的說,資料結構和演算法是思想和靈魂,語言就是表達和實現思想的工具。可能你熟悉了一種語言,你就會用這門語言固定的工具去套用那些思想來完成乙個任務,而換了乙個語言,你仍然會用你熟悉的語言的工具方法去實現乙個任務。
那現在有了飛機,你還用跑步去目的地麼?
了解乙個演算法的思想是很重要的,實現乙個演算法可能是很簡單的。一切所謂的偉大的前提,都是你敢想。
幾種排序的思想靈魂—–遍歷次數,結束條件
先說冒泡:一次排序之後,總會把最大的找出來。冒泡是相鄰的兩個比較,大小交換,標號下移,在重複此過程。結束條件:直到一次排序過程中沒有交換,說明已經有序,結束。
var bubblesort=function
(arry)}}
return arry;
};
外層迴圈是排序的次數,內層的迴圈是遍歷元素交換。
再說快排:理論上講,冒泡和快排都是一種借助了交換的方法。
快排的基本思想就是二分,找到乙個key作為基本點進行左右二分,這個key被形象的稱為「樞軸」。一次快排中,比key小的被分到一起成為新的快排物件,比key大的被分到一起成為新的快排物件,接下來。。。沒錯,接下來就是遞迴的過程了。
這裡,我先用原始的方法寫了一遍,原始方法是利用下標來完成移動的過程的。
function
qsort
(arry,i,j)//遞迴出口,i>j時,說明找到key的位置,結束
var low=i ;
var high=j;
var key=arry[i];
while(iwhile((i=key)) --j;//找位子
arry[i]=arry[j];
while((i//找位子
arry[j]=arry[i];
}arry[i]=key;//到這裡,就是一次二分,你可以把下面的遞迴注釋,來看看結果。
qsort(arry,low,i-1);//開始遞迴。
qsort(arry,i+1,high);
}var ay=[3,2,4,6,1,8,0];
qsort(ay);
alert(ay);
其實,我們再來理解一下,我把比key大的放一組,比key小的放一組,在對大的和小的做重複的操作,那麼,真正結束的條件應該是直到當你分的組裡面只有乙個元素,那就是key的時候,你就分完了,整體也就有序了。
js提供了豐富的資料操作,就是不想讓你把時間花在來回弄下標玩,把二分的思想最直接的表現出來,應該是這樣的**(我逛部落格時發現的!)
function
qsort
(arry)else
}return qsort(left).concat(key,qsort(right));//遞迴
}document.write(qsort([3,1,2,6,4]));
插入排序
每一次排序結束,之前的部分都會是有序的,這就意味著,你是在乙個有序的數列的基礎上排序的。你需要用你接下來的元素和這個有序的數列比較,並插入到應該在的位子,知道遍歷了所有的元素。
乙個要注意的地方就是當你知道了要插入的位子時的插入操作,可能簡單的想,就插入進去被,然後後面的依次後移,這種方法完全可以,你需要乙個新的陣列,向這個陣列中不斷的插入新的元素,來完成排序。
也可以不用,當你找到了要插入的位子時,以此時你的元素key位子為起點,向插入的位子,也就是向前位移,這是乙個元素覆蓋的過程,到你指定要插入的位子時,將此位置覆蓋為key,完成移動。
function
insetsort
(arry)
arry[j]=key;}}
}var ay=[3,2,4,6,1,8,0];
insetsort(ay);
alert(ay);
若有不足,希望指點提出,感謝各位。 JS排序演算法總結 (一)氣泡排序
目的 掌握氣泡排序的基本思想與過程 實現 時間複雜度與優化 1 基本思想與過程 從後向前兩兩比教,大數下沉,小數冒泡,一輪比較後,最小數的位置就排好了,在第乙個位置。重複上述過程,依次將第2.3.n 1個最小數排好位置。2 實現 function bubblesort arr console.log...
JS排序演算法
function insertsort arr endif status new date st ms return arr function shellsort arr while increment 1 status new date st ms return arr function shel...
排序演算法(JS)
自己整理一下資料結構的排序演算法,用js寫了一下,測試正確。插入排序 var table 32,26,87,72,26,17 for var i 0 i 0 temp0 alert i table 快速排序 快速排序是找出乙個元素 理論上可以隨便找乙個 作為基準 pivot 然後對陣列進行分割槽操作...