快速排序:
快速排序是另乙個分而治之排序演算法。
我們將看到,這種確定性的,非隨機化的快速排序的版本可能在對手輸入中具有o(n2)的很差的時間複雜度,之後再繼續隨機化的和可用的版本。
疑問:「確定的,非隨機化的」指的是什麼?指的是樞紐點的選取。
快速排序是分而治之的演算法:
劃分步驟:選擇乙個專案 p(稱為樞軸點)然後將 a[i..j] 的專案分為三部分:a [i..m-1],a [m] 和 a[m + 1..j]。 a [i..m-1](可能為空)包含小於 p 的專案。 a [m] 是樞軸點 p,例如:指數 m 是已排序陣列 a 的排序順序中 p 的正確位置。 a [m + 1..j](可能為空)包含大於或等於 p 的專案。 然後,遞迴地對這兩部分進行排序。
解決步驟:不要驚訝......我們什麼都不做!
如果您將其與歸併排序進行比較,您會發現快速排序的 d&c 步驟與歸併排序完全相反。
d&c: devide & conquer, 分 and 治。
重要的子程式,o(n)分割槽:
我們首先討論其最重要的子程式:o(n)分割槽,然後解析這個快速排序演算法。
要分割槽 a[i..j],我們首先選擇 a[i] 作為樞紐 p。其餘專案(即a [i + 1..j])分為3個區域:
s1 = a [i + 1..m]其中專案 < p,
s2 = a [m + 1..k-1]其中專案 ≥ p,且
未知的= a [k..j],其中專案尚未分配給 s1 或 s2。
討論:為什麼我們選擇 p = a [i]? 還有其他選擇嗎?
更難的討論:始終在s2上放置 == p的專案是好的嗎?
分割槽排序 - 繼續:
最初,s1 和 s2 區域都是空的,即除了指定的樞軸點 p 之外的所有專案都在未知區域中。
然後,對於未知區域中的每個專案 a [k],我們將 a[k] 與 p 進行比較, 並決定兩種情況中的乙個:
如果 a [k]≥p,則將 a[k] 放入 s2 或
否則,將 a[k] 放入 s1 中。
接下來的兩張幻燈片將會詳細闡述了這兩種情況。
最後,我們交換a[i]和 a[m] 來將樞紐 p 放在 s1 和 s2 的中間。
分割槽排序 - 當a[k] >= p的情況:
分割槽排序 - 當a[k] < p的情況:
分割槽排序 - c++實現:
} // 注意:在情況1的時候我們什麼不做: a[k] >= p
swap(a[i], a[m]); // 最後一步, 用a[m]交換樞紐
return m; // 返回樞紐的指數, 用於快速排序(quick sort)
快速排序c++實現:
快速排序:第一部分 分析:
首先,我們分析跑一次分割槽的成本。
在內部分區(a,i,j)中,只有乙個for迴圈遍歷(j-i)次。 由於j可以和 n-1一樣大,i 可以低至0,所以分割槽的時間複雜度是o(n)。
類似於歸併排序分析,快速排序的時間複雜度取決於分割槽(a,i,j)被呼叫的次數。
快速排序:第三部分 分析:(第二部分,略)
在這種最壞情況的輸入場景(最壞場景指的是已排序序列)中,會發生以下情況:
第乙個分割槽需要o(n)時間,將a分成0,1,n-1個專案,然後向右遞迴。
第二個花費o(n-1)時間,將a分成0,1,n-2個專案,然後再次向右遞迴...
直到最後,第n個分割槽將a分成0,1,1項,並且quick sort遞迴停止。
這是經典的n +(n-1)+(n-2)+ ... + 1模式,它是o(n2),類似於本幻燈片中的分析......
快速排序:最好的情況(極少):
當分割槽總是將陣列分成兩個相等的一半時,就會發生快速排序的最佳情況,如歸併排序。
當發生這種情況時,遞迴的深度只有o(log n)。
由於每個級別進行o(n)比較,時間複雜度為o(n log n)。
**:
int partition(int arr, int low, int high)
}printf("[index:%2d%2d], data: %2d%2d\n",
low, mid_index, arr[low], arr[mid_index]);
tmp_data = arr[mid_index];
arr[mid_index] = arr[low];
arr[low] = tmp_data;
return mid_index;
}void quicksort(int arr, int low, int high)
return;
}
排序演算法5 快速排序
1.什麼是快速排序 快速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 nlogn 次比較。在最壞狀況下則需要 n 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 nlogn 演算法更快,因為它的內部迴圈 inner loop 可以在大部分的架構上很有效 率地...
排序演算法5 快速排序
快速排序是對氣泡排序基礎上的優化版本,它打破了氣泡排序只能比對交換相鄰元素的方式,並加入了 分治 思想 1 對一串行,選定最左邊的元素作為基數p 再定義i,使i依次從左到右尋找比基數p大的元素 再定義j,使j依次從右到左尋找比基數p小的元素 當i j每每找到,便交換i j元素,直到i j相遇 2 將...
基礎排序演算法 快速排序
快速排序大家應該都知道,快速排序是一種不穩定的演算法,運氣差可以降速降到冒泡的速度,運氣好能快到比歸併還快的速度。首先,快速排序需要選擇乙個x,這個數很多人稱為基準。剛開始的時候選擇 a 0 當x,讓i l,j r 剛開始的時候l和r分別為最左邊和最右邊。1 讓j減小,直到遇到 i 或者找到乙個小於...