我們已經知道有一些常見的排序演算法,如氣泡排序,選擇排序, 插入排序, 歸併排序,快速排序和堆排序。下面我們逐個地分析並編寫相關**。
首先在排序之前,我們需要先建立乙個陣列來表示待排序和搜尋的資料結構以及陣列操作中最常見的交換位置函式swap。**如下:
function arraylist() ;
this.tostring = function ()
var swap = function (array, index1, index2)
}
下面逐個地分析各種排序演算法:
氣泡排序:顧名思義,氣泡排序是比較兩個相鄰的項,如果第乙個比第二個大,則交換它們。元素項向上移動至正確的順序,就好像氣泡公升至表面一樣。**如下:
this.bubblesort = function () }}
};
我們注意到冒泡演算法執行到外迴圈的第二輪的時候,前兩位數字其實已經是排好序的,而在後續比較中,它們還進行著比較,這是不必要的,所有有了一種改進的冒泡演算法,**如下:
this.modifiedbubblesort = function () }}
};
選擇排序:選擇排序演算法是一種原址比較排序演算法。選擇排序大致的思路是找到資料結構中的最小值並將其放置在第一位,接著找第二小的值並放在第二位,以此類推。源**如下:
this.selectionsort = function ()
}if (i !== indexmin)
}};
插入排序:插入排序每次排乙個陣列項,以此方式構建最後的排序陣列。假定第一項已經排好序了,接著,它和第二項進行比較,第二項是應該待在原位還是插到第一項之前?這樣,頭兩項就已經正確排序了,接著喝第三項比較,一次類推,源**如下:
this.insertionsort = function ()
array[j] = temp;
}};
歸併排序:歸併排序是一種分治演算法。其思想是將原始陣列切分成較小的陣列,直到每個小陣列只有乙個位置,接著將小陣列歸併成較大的陣列,直到最後只有乙個排序完畢的大陣列。源**如下:
function mergesort(arr) else
}function merge(left, right) else
}return arr.concat(left, right);
}
快速排序:快速排序也是使用分治的方法,將原始陣列分為較小的陣列。快速排序比之前的幾種排序演算法要複雜一下,這裡寫清楚它的步驟:
首先,從陣列中選擇中間一項作為主元。
建立兩個指標,左邊乙個指向陣列第一項,右邊乙個指向陣列最後乙個項。移動左指標直到我們找到乙個比主元大的元素,接著,移動右指標直到找到乙個比主元小的元素,然後交換它們,重複這個過程,直到左指標超過了右指標。這個過程使得比主元小的元素都排在主元之前,而比主元大的值都排在主元之後。因此這一步也叫劃分操作。
接著,演算法對劃分後的小陣列(較主元小的值組成的子陣列,以及較主元大的值組成得子陣列)重複之前的兩個步驟,直至陣列已完全排序。
快速排序的源**如下:
this.quicksort = function (arr)
//取基準點:主元元素
var pivotindex = math.floor(arr.length / 2);
//取基準點的值,splice(index,1)函式可以返回陣列中被刪除的數組成的陣列,
1)[0]得到被刪除的那乙個數,即主元元素值
var pivot = arr.splice(pivotindex, 1)[0];
var left = ;//存放比基準點小的陣列
var right = ;//存放比基準點大的陣列
for (var i = 0; i < arr.length; i++) else
}//遞迴執行以上操作,對左右兩個陣列進行操作,直到陣列長度為<=1;
//將左右排好序的陣列以及主元重新組成乙個陣列,則這時就組成乙個全部排好序的陣列
return quicksort(left).concat([pivot], quicksort(right));
}var arr1 = [2,1,3,45,34,90,0];
console.log(quicksort(arr1));//0 1 2 3 34 45 90
堆排序:堆排序將陣列當作二叉樹來排序。堆排序將陣列的索引按照一定的規則進行變換;
堆排序的源**如下:
this.heapsort = function ()
};var buildheap = function (array)
};var heapify = function (array, heapsize, i)
if (right < heapsize && array[right] > array[largest])
if (largest !==i)
};
順序搜尋:順序搜尋演算法是最基本的搜尋演算法。它的機制是,將每乙個資料結構中的元素和我們要找的元素做比較,所以該演算法也是最低效的一種演算法。
this.sequentialsearch = function (item)
}return -1;
};
二分搜素:這個演算法要求被搜尋的資料結構已排序,步驟如下:
**如下:
this.binarysearch = function (item) else if(element > item)else
}return -1;
};
演算法 排序演算法 搜尋演算法
排序演算法 function arraylist this.tostring function item 冒泡 this.bubblesort function function swap arr,index1,index2 改進冒泡,減少內迴圈不必要的比較次數,每一輪最後兩個數下一次沒必要再比較 ...
A 搜尋演算法
啟發式搜尋演算法 要理解 a 搜尋演算法,還得從啟發式搜尋演算法開始談起。所謂啟發式搜尋,就在於當前搜尋結點往下選擇下一步結點時,可以通過乙個啟發函式 來進行選擇,選擇代價最少的結點作為下一步搜尋結點而跳轉其上 遇到有乙個以上代價最 少的結點,不妨選距離當前搜尋點最近一次展開的搜尋點進行下一步搜尋 ...
A 搜尋演算法
a 演算法是基於bfs的一種入門級啟發式搜尋演算法,就是將bfs的佇列改為基於估價的優先佇列,可以快速地找到答案。優先隊列為小根堆 while 優先佇列不為空 取出隊頭並擴充套件 將擴充套件節點以估價值 當前值為優先順序入隊 endwhile估價函式越接近真實值演算法越優,但一定不能大於真實值,否則...