C 快速排序

2022-09-19 10:45:12 字數 1153 閱讀 3361

快速排序是一種基於交換的高效排序演算法,它採用了分治法的思想。步驟如下:

從數列中選出乙個數作為基準數(樞軸,pivot)

將陣列進行劃分(partition),將比基準數大的元素移至樞軸右側,將比基準數小的元素移至樞軸左側。

對左右兩區間分別進行第二步的劃分操作,知道每個子區間只有乙個元素。

快排最重要的步驟就是劃分了(partition)。劃分的過程用通俗的語言講就是「挖坑」和「填坑」。

較小,請原諒

int partition(int arr, int left, int right)  //找基準數進行劃分

} swap(arr[pivot], arr[cur-1]); //將樞軸移至陣列正確位置

return cur-1; //返回樞軸位置

}void quick_sort(int arr, int left, int right)

快排的時間複雜度在最壞情況下是o(n²),平均的時間複雜度是o(n log n)

怎麼理解呢?其實很簡單。假設數列中有n個數,則遍歷一次的時間複雜度為 o(n),需要遍歷至少 log (n + 1)次,最多 n次。

+q1:為什麼最少是 log (n + 1)次?

+a1:快速排序是採用分治法進行遍歷的,所以可以看成一棵二叉樹,它遍歷的次數就是二叉樹的深度。而根據二叉樹的定義,它的深度至少為 log (n + 1)。因此快速排序的遍歷次數至少是 log (n + 1)次。

+q2:為什麼最多是 n次遍歷?

+a2:這個應該比較好理解。仍然將快速排序看作一棵二叉樹,二叉樹的最大深度為 n。所以快速排序的遍歷次數最多是 n次。

快速排序是不穩定的演算法,它不滿足穩定排序演算法的定義。 演算法穩定性:假設在數列中存在 a[i] = a[j],若在排序之前,a[i] 在 a[j] 前面,並且排序後,a[i]仍然在 a[j]前面,則這個排序是穩定的!

that's all!thank you for watching !

快速排序優化已更新!傳送門

排序 快速排序(C )

1 演算法描述 1.1 設當前參加排序的陣列為array 0.n 1 選擇乙個元素 通常稱該元素為基準元素 作為基準元素 將小於或者等於基準元素的所有元素都移到基準元素的左邊 把大於或者等於基準元素的所有元素都移到分界元素的右邊 執行完 2 3 步驟後,基準元素左邊元素序列,基準元素,基準元素右邊元...

排序 快速排序(C )

如果看不懂這些乾巴巴的理 字,那就先不用看了,下面 中有詳細的注釋,大家可以先跟著 走幾遍,回過頭來再看這些文字描述,總之 紙上得來終覺淺,絕知此事要躬行。排序演算法哪家強,從實際應用的角度上將,快排表現很好。很自然地,人們會覺得短陣列比長陣列更好處理,因此可能會想到將原始陣列分為若干各子部分然後分...

快速排序 c

快速排序應該是目前最快,也是最常用的一種排序演算法。它將乙個集合劃分成兩個子集合,然後繼續遞迴來完成最終排序。具體做法 1.選取集合最右端的元素作為乙個參照物,稱之為 樞紐 pivot 2.開始計算分割位置。在計算時,進行元素交換,確保左側元素都小於樞紐,而右側都大於樞紐。3.根據分割位置,分別遞迴...