走進資料結構之排序(四) 快速排序

2021-07-31 13:57:31 字數 3458 閱讀 6495

公升序演算法描述:在資料序列中選擇第乙個元素作為基準值,每趟從資料序列的兩端開始交替進行,將小於基準值的元素交換到序列前端,將大於基準值的元素交換到序列後端,介於兩者之間的位置則成為基準值的最終位置,同時,序列被劃分成兩個子序例,再分別對兩個子串行進行快速排序,直到子串行長度為1,則完成排序。

降序,我就不多介紹了,就改改關鍵字眼,**實現有降序,可以看看**!

package top.einino.swapsort;

public class quicksort

//asc為true表示公升序,asc為false表示公升序

public static void quicksort(int keys, boolean asc)

//對存於keys陣列begin-end之間的子串行進行一趟排序,遞迴演算法。

private static void quicksort(int keys, int begin, int end,boolean asc)

//子串行將後端較小元素(較大元素)向前移動,第一次移動是移動到子串行的第乙個位置

if(i

keys[i++] = keys[j];

}//公升序(降序)第一次移動從子串行的第二個位置這個前方位置一步步向後尋找較大值(較小值),不移動與基準值相等元素

while(i=vot))

//公升序(降序)第一次移動是將基準值與子串行倒著數比基準值還小(大)的位置作為替換。子串行前端較大(小)元素向後移動

if(i

keys[j--] = keys[i];}}

//基準值到達最終位置

keys[i] = vot;

system.out.print(begin + ".." + end + ", vot=" + vot + " ");

print(keys);

//經過一趟排序,基準值已然落到i的位置

//公升序(降序)前端子串行都比基準值小(大),後端子序列都比基準值大(小)

//但是兩個子串行是處於無序狀態

//所以得遞迴呼叫,讓其成為有序,並讓其各自的子串行都有序

//而且此趟的基準值也不用再參與排序。

//前端子串行再排序,遞迴呼叫

quicksort(keys, begin, i-1, asc);

//後端子序列再排序,遞迴調到

quicksort(keys, i+1, end, asc);}}

//輸出排序陣列

private static void print(int keys)

system.out.println();

}public static void main(string args) ;

//測試快速排序公升序

quicksort(keys);

int keys2 = ;

//測試快速排序降序

quicksort(keys2, false);

}體育老師的課就是多。又來排隊伍了。

初始隊伍:a學生138、b學生138、c學生197、d學生175、e學生161、f學生119、g學生126、h學生149

老師開始進行排序(公升序)了

首先老師把a學生拉出隊伍,與後面的h學生進行比較,結果a接著,與後面的g學生進行比較,結果a>h,所以老師把g學生排到a學生的位置,這時g學生的位置就空出來了

再著,與前面b學生進行比較,結果a=b,所以不改變b學生的位置

與前面c學生再進行比較,結果a接著與後面的f學生進行比較,結果a>f,所以把f學生放到c學生原來的位置上,此時f學生的位置就空出來了

接著與前面的d學生進行比較,結果a此時d學生原來的位置的後一位置還不是f學生原來的位置,還需要繼續進行排序

與後面的e學生進行比較,結果a但在這時會發現,現在只能與前面d學生原來的位置被空出來的位置進行比較了,而且d學生原來的位置的接下來的位置也剛好是剛好排好序的e學生,所以就可以把基準值放到d學生原來的位置,結束排序了

最後的序列是g學生126、b學生138、f學生119、a學生138、e學生161、d學生175、c學生197、h學生149

老師接著進行前端子串行1(g學生126、b學生138、f學生119)與後端子序列2(e學生161、d學生175、c學生197、h學生149)的排序

進行前端子串行1(g學生126、b學生138、f學生119):

把g學生拉出隊伍,與後面的f學生進行比較,結果g>f,所以把f學生放到g學生的位置,f學生的位置也空出來了

再與b學生進行比較,結果g這時會發現b學生接下來的位置就是f學生,所以就不用進行比較了,把g學生放到b學生的位置

結果前端子串行1為f學生119、g學生126、b學生138

接著進行前端子串行1的兩個子串行的排序:分別是前端子串行11:f學生119、後端子序列12:b學生138,因為兩個子串行的長度都只為1,所以就不用進行排序了

老師開始後端子序列2的排序(e學生161、d學生175、c學生197、h學生149):

首先把e學生拉出隊伍,與h學生進行比較,結果e>h,所以把h學生放到e學生的位置,這時h學生的位置就空出來了

再與d學生進行比較,結果e再與c學生進行比較,結果e這時由於d學生空出來的位置的下乙個剛好是c學生的位置,所以就不用再進行排序了,直接把e學生放到d學生原來的位置上

結果後端子序列2的順序為h學生149、e學生161、c學生197、d學生175

接著進行後端子序列2的兩個子串行的排序,分別是:

前端子串行21:h學生149

後端子序列22:c學生197、d學生175

因為前端子串行21只有乙個人,就不用再進行排序了

進行後端子序列22的排序

將c學生拉出隊伍,與d學生進行比較,結果c>d,所以老師把d學生排到c學生的位置,這時發現c學生原來的位置的接下來的位置就是d學生原來的位置,所以就不用再進行排序了,把c學生放到d學生的位置,最後後端子序列22的順序為:d學生175、c學生197

最後後端子序列2的順序為:h學生149、e學生161、d學生175、c學生197

最後整個的排序為:

f學生119、g學生126、b學生138、a學生138、h學生149、e學生161、d學生175、c學生197

1、最好情況,每趟排序將序列分成長度相近的兩個子串行,時間複雜度為o(n*log2(n))(log2(n)表示以2為底的n的對數,以下涉及到是一樣的表示形式)

2、最壞情況,每趟排序列分成長度差異很大的兩個子串行,時間複雜度為o(n^2)

快速排序在執行遞迴函式過程中花費一定的時間和空間,使用棧儲存引數,棧所占用的空間與遞迴呼叫的次數有關,空間複雜度為o(log2(n)~o(n)

在快速排序演算法中,會錯過關鍵字相等的比較,比如上面的例子a學生138、b學生138、但是a學生138在排序過程中,直接與後面的g學生126進行比較,直接把a學生的位置跳到b學生位置的後面,即使再遇到與b學生的比較,也不會再跳回b學生的前面了,導致關鍵字相等的元素在最後的結果發生的順序的改變,所以快速演算法是不穩定的。

本博文從快速排序演算法分析,公升序和降序**實現,老師排隊的例子講演,時間複雜度的2種情況,空間複雜度以及穩定性介紹了快速排序的方方面面。

演算法 排序(四)快速排序

快速排序 對氣泡排序的一種改進 1 時間複雜度o nlogn o n2 2 空間複雜度o logn o n 排序排序需要棧空間實現遞迴 3 不穩定的 4 快速排序的思想 帶排序列經過一次快排劃分,可以得到 子串行5 遞迴實現void qsort int l,int low,int high 用if ...

PHP 排序演算法(四) 快速排序

快速排序 思路 我們首先要找到乙個基準,陣列的前半部分是比基準小的元素,陣列後半部分是比基準大的元素,這裡我就拿陣列第乙個元素作為基準 設定隊首和隊尾兩個指標 隊尾指標先進行活動,一直向隊首移動,直到找到比基準值小的元素,然後將這個值賦給隊首指標處 下面隊首指標開始活動,一直向隊尾移動,直到找到比基...

常用演算法總結之排序(四) 快速排序

快速排序是對氣泡排序的一種改進。使用分治的策略進行排序。基本思想 通過一遍排序將待排序資料劃分為兩部分,使其中一部分比另一部分小,然後分別對兩部分資料繼續進行快速排序,直至每部分為空或只包含乙個資料。通過快速排序思想的描述可以很明顯的看出快速排序是一種採用遞迴排序的方法。具體排序過程 通過分治策略將...