常見的幾種數組排序算法JS實現
網上找到一些算法思想,然后自己用JS表現出來(小菜一只,大神勿噴)
思想到是很簡單,打代碼,調試代碼,細節可以讓人抓狂,好了不說了,下面是我的勞動成果
常見的排序算法思想
快速排序
從給定的數據中,隨機抽出一項,這項的左邊放所有比它小的,右邊放比它大的,然后再分別這兩邊執行上述操作,采用的是遞歸的思想,總結出來就是 實現一層,分別給兩邊遞歸,設置好出口
function fastSort(array,head,tail){
//考慮到給每個分區操作的時候都是在原有的數組中進行操作的,所以這里head,tail來確定分片的位置
/*生成隨機項*/
var randomnum = Math.floor(ranDom(head,tail));
var random = array[randomnum];
/*將小於random的項放置在其左邊 策略就是通過一個臨時的數組來儲存分好區的結果,再到原數組中替換*/
var arrayTemp = [];
var unshiftHead = 0;
for(var i = head;i <= tail;i++){
if(array[i]<random){
arrayTemp.unshift(array[i]);
unshiftHead++;
}else if(array[i]>random){
arrayTemp.push(array[i]);
}
/*當它等於的時候放哪,這里我想選擇放到隊列的前面,也就是從unshift后的第一個位置放置*/
if(array[i]===random){
arrayTemp.splice(unshiftHead,0,array[i]);
}
}
/*將對應項覆蓋原來的記錄*/
for(var j = head , u=0;j <= tail;j++,u++){
array.splice(j,1,arrayTemp[u]);
}
/*尋找中間項所在的index*/
var nowIndex = array.indexOf(random);
/*設置出口,當要放進去的片段只有2項的時候就可以收工了*/
if(arrayTemp.length <= 2){
return;
}
/*遞歸,同時應用其左右兩個區域*/
fastSort(array,head,nowIndex);
fastSort(array,nowIndex+1,tail);
}
插入排序
思想就是在已經排好序的數組中插入到相應的位置,以從小到大排序為例,掃描已經排好序的片段的每一項,如大於,則繼續往后,直到他小於一項時,將其插入到這項的前面
function insertSort(array){
/*start根據已排列好的項數決定*/
var start=1;
/*按順序,每一項檢查已排列好的序列*/
for(var i=start; i<array.length; start++,i++){
/*跟已排好序的序列做對比,並插入到合適的位置*/
for(var j=0; j<start; j++){
/*小於或者等於時(我們是升序)插入到該項前面*/
if(array[i]<=array[j]){
console.log(array[i]+' '+array[j]);
array.splice(j,0,array[i]);
/*刪除原有項*/
array.splice(i+1,1);
break;
}
}
}
}
冒泡排序
故名思意 ,就是一個個冒泡到最前端或者最后端,主要是通過兩兩依次比較,以升序為例,如果前一項比后一項大則交換順序,一直比到最后一對
function bubbleSort(array){
/*給每個未確定的位置做循環*/
for(var unfix=array.length-1; unfix>0; unfix--){
/*給進度做個記錄,比到未確定位置*/
for(var i=0; i<unfix;i++){
if(array[i]>array[i+1]){
var temp = array[i];
array.splice(i,1,array[i+1]);
array.splice(i+1,1,temp);
}
}
}
}
選擇排序
將當前未確定塊的min或者max取出來插到最前面或者后面
function selectSort(array){
/*給每個插入后的未確定的范圍循環,初始是從0開始*/
for(var unfixed=0; unfixed<array.length; unfixed++){
/*設置當前范圍的最小值和其索引*/
var min = array[unfixed];
var minIndex = unfixed;
/*在該范圍內選出最小值*/
for(var j=unfixed+1; j<array.length; j++){
if(min>array[j]){
min = array[j];
minIndex = j;
}
}
/*將最小值插入到unfixed,並且把它所在的原有項替換成*/
array.splice(unfixed,0,min);
array.splice(minIndex+1,1);
}
}
總結一下,實現思想是很簡單的,難點在於如何創造思想,還有就是個人的測試能力,和編程習慣,做注釋其實不是僅僅為了別人看得更方便,而是自己思路的記錄,有些人編着編着容易斷片,注釋起到了很好的引導作用
