快速排序(英語:quicksort),又稱劃分交換排序(partition-exchange sort),簡稱快排,一種排序演算法,最早由東尼·霍爾提出。在平均狀況下,排序n個專案要o(nlogn)次比較。在最壞狀況下則需要o(n^2)次比較,但這種狀況並不常見。事實上,快速排序o(nlogn)通常明顯比其他演算法更快,因為它的內部迴圈(inner loop)可以在大部分的架構上很有效率地達成快速排序可能大家都學過,在面試中也經常會遇到,哪怕你是做前端的也需要會寫,這裡會列舉兩種不同的快排**進行分析
從陣列中選擇乙個元素作為基準點
排序陣列,所有比基準值小的元素擺放在左邊,而大於基準值的擺放在右邊。每次分割結束以後基準值會插入到中間去。
最後利用遞迴,將擺放在左邊的陣列和右邊的陣列在進行一次上述的1和2操作。
為了更深入的理解,可以看下面這張圖
我們根據上面這張圖,來用文字描述一下
選擇左右邊的元素為基準數,7
將小於7的放在左邊,大於7的放在右邊,然後將基準數放到中間
然後再重複操作從左邊的陣列選擇乙個基準點2
3比2大則放到基準樹的右邊
右邊的陣列也是一樣選擇12作為基準數,15比12大所以放到了12的右邊
最後出來的結果就是從左到右 2 ,3,7,12,15了
以上就是快速排序基本的乙個實現思想。
這是我最近看到的一種快排**
var quicksort = function(arr)
var pivotindex = math.floor(arr.length / 2);
var pivot = arr.splice(pivotindex, 1)[0];
var left = ;
var right = ;
for (var i = 0; i < arr.length; i++) else
} return quicksort(left).concat([pivot], quicksort(right));
};
以上**的實現方式是,選擇乙個中間的數字為基準點,用兩個陣列分別去儲存比基準數小的值,和比基準數大的值,最後遞迴左邊的陣列和右邊的陣列,用concat去做乙個陣列的合併。
對於這段**的分析:
缺點:優點:
那麼我們接下來用另外一種方式去實現快速排序
從上面這張圖,我們用乙個指標i去做了乙個分割
下面我們來看一下**的實現,整個**分成三部分,陣列交換,拆分,qsort(主函式)三個部分
先寫最簡單的陣列交換吧,這個大家應該都懂
function swap(a, i ,j)
下面是拆分的過程,其實就是對指標進行移動,找到最後指標所指向的位置
/**
* * @param a 陣列
* @param p 起始下標
* @param r 結束下標 + 1
*/ function dvide(a, p, r)
}// 最後將基準點插入到i+1的位置
swap(a, i+1, r-1);
// 返回最終指標i的位置
return i+1;
}
主程式主要是通過遞迴去重複的呼叫進行拆分,一直拆分到只有乙個數字。
/**
* * @param a 陣列
* @param p 起始下標
* @param r 結束下標 + 1
*/function qsort(a, p, r)
return a;
}
function swap(a, i, j)
/** *
* @param a 陣列
* @param p 起始下標
* @param r 結束下標 + 1
*/function divide(a, p, r)
} swap(a, i + 1, r - 1);
return i + 1;
}/**
* * @param a 陣列
* @param p 起始下標
* @param r 結束下標 + 1
*/function qsort(a, p = 0, r)
return a;
}
第二段的排序演算法我們減少了兩個o(n)的操作,得到了一定的效能上的提公升,而第一種方法資料規模足夠大的情況下會相對來說比較慢一些,快速排序在面試中也常常出現,為了筆試更好寫一些可能會有更多的前端會選擇第一種方式,但也會有一些為難人的面試官提出一些演算法中的問題。而在實際的專案中,我覺得第一種方式可以少用。
js資料結構-鍊錶
js資料結構-佇列
js資料結構-二叉樹(二叉堆)
js資料結構-二叉樹(二叉搜尋樹)
js快速排序演算法
演算法 1 先從數列中取出乙個數作為基準數。2 分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。3 再對左右區間重複第二步,直到各區間只有乙個數。動畫演示 點我檢視效果 實現 function quicksort array hight 從左往右找,直到找到乙個大於基準的...
JS排序演算法之快速排序
快速排序和歸併排序都是採用二分法的排序演算法。都是 olog n 不過快速排序更複雜一些。快遞排序跟歸併排序的區別是順序,它是先總後分。不斷地從斷點分,讓左邊的數都小於斷點,右邊都大於斷點。然後迭代切分。1 var group 1,9,3,5,0,4,2,8 23 function swap k,y...
js的 快速排序 演算法
快速排序的原理 選擇陣列中的隨便乙個元素作為基準,遍歷陣列,將大於它的元素放在右邊,小於他的元素放在左邊。然後對左右兩邊的陣列繼續執行如上操作,如此遞迴直到左右兩邊的陣列為1。js簡單實現 var quicksort function arr var pivotindex math.floor ne...