快速排序(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 ...