程序填充(指针):3数排序_排序算法之快速排序,它为什么这么快?
1 快速排序?qū)嵗?/h2>
快速排序由C. A. R. Hoare在1960年提出,是冒泡排序的一種改進(jìn)。快速排序就跟它的名字一樣,效率很快。跟冒泡排序,選擇排序相比,它們使用相同的空間大小,但是,快速排序卻可以達(dá)到O(nlogn)的時(shí)間復(fù)雜度,比O(n^2)要快上很多。那么,快速排序是怎么做的呢?它的核心思想是,找到一個(gè)基準(zhǔn)數(shù),讓這個(gè)基準(zhǔn)數(shù)到它該去的位置。并且,基準(zhǔn)數(shù)左邊的數(shù)都比這個(gè)它要小,右邊的數(shù)都比它要大。根據(jù)這個(gè)思想,我們每一趟至少能夠保證基準(zhǔn)數(shù)在它應(yīng)該在的位置,并且右邊的數(shù)都大于左邊的數(shù),整體基本有序。那怎么處理基準(zhǔn)數(shù)左邊和右邊兩部分的數(shù)呢?很簡(jiǎn)單,分別對(duì)左邊和右邊遞歸剛剛那個(gè)過(guò)程,就ok了。這就是快速排序,由于每次都能夠排好一個(gè)數(shù),并且能夠保證左邊區(qū)域的數(shù)只需要在左邊區(qū)域排序,右邊區(qū)域的數(shù)只需要在右邊區(qū)域排序,它們本身在該在位置的概率很大,大大降低了需要交換的次數(shù)。
我們來(lái)看例子,給定數(shù)組[4,5,1,10,3,6,9,2],怎么用快速排序?qū)λ判蚰?#xff1f;
首先,選擇第一個(gè)數(shù)作為基準(zhǔn)數(shù)
設(shè)置指針i和j,分別指向最左和最右
指針j向左移動(dòng),找到第一個(gè)小于基準(zhǔn)數(shù)4的位置。由于指向的2比4小,所以指針j沒(méi)有移動(dòng)。
指針i向右移動(dòng),找到第一個(gè)大于基準(zhǔn)數(shù)4的位置
交換指針i和j對(duì)應(yīng)的元素
指針j繼續(xù)向左移動(dòng),找到了3比基準(zhǔn)數(shù)小。
指針i繼續(xù)向右移動(dòng),找到了10比基準(zhǔn)數(shù)大。
交換指針i和j對(duì)應(yīng)的元素
指針j繼續(xù)左移,與指針i相遇,停止。
交換指針i與基準(zhǔn)數(shù)所在位置的元素。
這一趟快速排序結(jié)束,基準(zhǔn)數(shù)4達(dá)到了它應(yīng)該在的位置。而左邊都是比4小的數(shù),右邊都是比4大的數(shù)。接下來(lái)我們只需要遞歸這個(gè)過(guò)程就可以了。
2 代碼解析
49-62行就是剛剛的例子中做的操作,具體在代碼注釋中已經(jīng)寫(xiě)明。
66,67行,分別遞歸處理左邊和右邊,最終完成整體排序。
這里還有一個(gè)問(wèn)題:為什么每次都要從右邊開(kāi)始找,而不能從左邊開(kāi)始找呢?
如果從左邊開(kāi)始找,那么在這個(gè)狀態(tài)時(shí),i往右一步就停止了。這時(shí)候,如果交換基準(zhǔn)數(shù)和指針i的元素,10會(huì)被交換到左邊,不符合快速排序“左邊的數(shù)都比基準(zhǔn)數(shù)小”的限制。之所以要讓指針j先動(dòng),就是因?yàn)?#xff0c;最后必須停在比基準(zhǔn)數(shù)小的元素,只有右邊先動(dòng)才可以保證。
3 效率分析
快速排序的效率跟基準(zhǔn)數(shù)的選擇有很大關(guān)系。
如果基準(zhǔn)數(shù)選得好,每次基準(zhǔn)數(shù)都能夠剛好排在中間的位置,遞歸的時(shí)候,兩個(gè)子問(wèn)題的大小就是平衡的,不停地二分下去,最終的時(shí)間復(fù)雜度就是
T(n)=T(n/2)+T(n/2)+O(n)=O(nlogn)
如果基準(zhǔn)數(shù)選得差,每次基準(zhǔn)數(shù)剛好是最大值或者最小值,每次子問(wèn)題的規(guī)模只減小了1,這樣無(wú)疑效率會(huì)差很多,最終的時(shí)間復(fù)雜度為
T(n)=T(n-1)+T(1)+O(n)=O(n^2)
總結(jié)
以上是生活随笔為你收集整理的程序填充(指针):3数排序_排序算法之快速排序,它为什么这么快?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 小爱音箱怎么装app_79元的Redmi
- 下一篇: aspose 换行写_aspose.wo