八大排序 快速排序及效能分析

2021-08-20 12:17:22 字數 1626 閱讀 7775

快速排序(quick sort)

1、快速排序:

它採用了

分治的策略

分治法(divide-and-conquermethod)的基本思想

:將原問題分解為若干個規模更小但結構與原問題相似的子問題

。遞迴地解這些子問題,然後將這些子問題的解組合為原問題的解。

快速排序的基本思想:

①從數列中挑出乙個元素(一般是陣列中的第乙個數或者最後乙個數),稱為

"基準"(pivot)

;②重新排序數列,所有比基準值小的元素擺放在基準前面,所有比基準值大的元素擺在基準後面(相同的數可以到任何一邊)。結束之後,該基準就處於數列的中間位置。這個過程就稱為

分割槽(partition)操作;③

遞迴地(recursively)把小於基準值元素的子數列和大於基準值元素的子數列排序。

遞迴到最底部時,數列的大小是零或一,就結束全部過程(已經排序完成)。

2、快速排序的實現:

**實現:

void quick_sort(int s, int low, int high)

//把基準數放在相應位置上

s[i] = key;

// 遞迴呼叫

quick_sort(s, low, i - 1);

quick_sort(s, i + 1, high);}}

語言描述:

①設定兩個變數i、j,初次排序開始的時候:i=0,j=n-1;

②以第乙個陣列元素作為基準數,賦值給key,即key=s[0];

③從j開始向前搜尋,即由後開始向前搜尋(j--),找到第乙個小於key的值s[j],將a[j]和a[i]互換;沒找到符合條件的值,使得j=j-1;

④從i開始向後搜尋,即由前開始向後搜尋(i++),找到第乙個大於key的s[i],將a[i]和a[j]互換;沒找到符合條件的值,使得i=i+1;

⑤重複第3、4步,直到i=j。

3、快排的時間複雜度和空間複雜度

①最好情況:

時間複雜度為:o(nlogn)

,即每次劃分產生的兩個區間大小都為區間總長(設為n)的一半;

空閒複雜度為:o(logn)

②最壞情況:

時間複雜度為:o(n^2)

,即每次劃分產生的兩個區間大小分別包含n-1個元素和1個元素;

空閒複雜度為:o(n)

注:快排使用的空間為:o(1),真正消耗空間的是遞迴呼叫。

八大排序(三) 快速排序

快速排序的基本思想如下 設要排序的陣列是a 0 a n 1 首先任意選取乙個資料 通常選用陣列的第乙個數 作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。值得注意的是,快速排序是一種不穩定的排序演算法,也就是說,多個相同的值的相對位置也許會在演算...

八大排序(五)快速排序

快速排序使用了分治策略。一 選定乙個基準數 一般選取第乙個數 然後把大於它的數都放在它右邊,把小於它的數放左邊。二 這樣就把陣列分成左右兩部分。再將左右兩部分分別遞迴執行第一步,最終當執行第一步的部分大小為一時,遞迴完成,原陣列排序完成。public class quicksort 將剛剛找到的數插...

八大排序之快速排序

快速排序 public class quicksort int arr 測試時間複雜度 o n 2 int arr new int 80000 for int i 0 i arr.length i long start time system.currenttimemillis quicksort ...