當(dāng)我們需要對(duì)一個(gè)無(wú)序的數(shù)組進(jìn)行排序時(shí),快速排序算法是一種高效的選擇。它通過(guò)將數(shù)組分為兩個(gè)較小的子數(shù)組來(lái)遞歸地排序最終達(dá)到整個(gè)數(shù)組有序。
下面我們來(lái)看一段簡(jiǎn)單的javascript代碼實(shí)現(xiàn)快速排序:
function quickSort(arr) { if (arr.length<= 1) { return arr; } const pivot = arr[Math.floor(arr.length / 2)]; const left = []; const right = []; for (let i = 0; i< arr.length; i++) { if (i === Math.floor(arr.length / 2)) { continue; } if (arr[i]< pivot) { left.push(arr[i]); } else { right.push(arr[i]); } } return quickSort(left).concat([pivot], quickSort(right)); } const unsortedArray = [3, 1, 8, 4, 7, 2, 6, 5]; console.log(quickSort(unsortedArray)); // [1, 2, 3, 4, 5, 6, 7, 8]
我們從數(shù)組中選擇中點(diǎn)(pivot),并將其與數(shù)組中其他元素進(jìn)行比較。將小于pivot的元素放入left子數(shù)組中,大于pivot的元素放入right子數(shù)組中。遞歸地對(duì)left和right子數(shù)組進(jìn)行排序,并將結(jié)果返回。最后,將排序后的left子數(shù)組、pivot和排序后的right子數(shù)組連接在一起即可得到有序的數(shù)組。
下面讓我們看一下算法的時(shí)間復(fù)雜度??焖倥判蛩惴ǖ钠骄鶗r(shí)間復(fù)雜度為O(n log n),最壞情況下時(shí)間復(fù)雜度為O(n^2)。最壞情況下的情形是當(dāng)數(shù)組的pivot點(diǎn)選取不當(dāng)時(shí),每個(gè)遞歸分治的子數(shù)組都非常接近于原數(shù)組,而遞歸過(guò)程會(huì)無(wú)限地進(jìn)行下去。但通過(guò)隨機(jī)選取pivot點(diǎn)或選用其他特殊的pivot選取方法可以減少出現(xiàn)最壞情況的概率。
快速排序是一種高效的排序算法。它不需要額外的存儲(chǔ)空間,而且在處理大數(shù)據(jù)集時(shí)表現(xiàn)良好。因此,它經(jīng)常被用于web應(yīng)用程序中的數(shù)據(jù)處理。