資料結構 快速排序演算法 C

2021-10-23 03:35:12 字數 1469 閱讀 1857

1、從數列中取出乙個數作為基準數(樞軸,pivot)。 

2、將陣列進行劃分(partition),將比基準數大的元素都移至樞軸右邊,將小於等於基準數的元素都移至樞軸左邊。

3、再對左右的子區間重複第二步的劃分操作,直至每個子區間只有乙個元素。

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

快速排序的時間複雜度在最壞情況下是o(n^2),平均的時間複雜度是o(n*lgn)。

這句話很好理解:假設被排序的數列中有n個數。遍歷一次的時間複雜度是o(n),需要遍歷多少次呢?至少lg(n+1)次,最多n次。

(01) 為什麼最少是lg(n+1)次?快速排序是採用的分治法進行遍歷的,我們將它看作一棵二叉樹,它需要遍歷的次數就是二叉樹的深度,而根據完全二叉樹的定義,它的深度至少是lg(n+1)。

因此,快速排序的遍歷次數最少是lg(n+1)次。

(02) 為什麼最多是n次?這個應該非常簡單,還是將快速排序看作一棵二叉樹,它的深度最大是n。因此,快讀排序的遍歷次數最多是n次。

快速排序是不穩定的演算法,它不滿足穩定演算法的定義。

演算法穩定性 -- 假設在數列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;並且排序之後,a[i]仍然在a[j]前面。則這個排序演算法是穩定的!

快速排序之所比較快,因為相比氣泡排序,每次交換是跳躍式的。每次排序的時候設定乙個基準點,將小於等於基準點的數全部放到基準點的左邊,將大於等於基準點的數全部放到基準點的右邊。這樣在每次交換的時候就不會像氣泡排序一樣每次只能在相鄰的數之間進行交換,交換的距離就大的多了。因此總的比較和交換次數就少了,速度自然就提高了。當然在最壞的情況下,仍可能是相鄰的兩個數進行了交換。因此快速排序的最差時間複雜度和氣泡排序是一樣的都是o(n2),它的平均時間複雜度為o(nlogn)。

//從小到大排序

//最左邊數字為pivot

void quicksort(vector& arr, int left, int right)

} //pivot復位

arr[left] = arr[i];

arr[i] = pivot;

quicksort(arr, left, i-1);//遞迴左邊

quicksort(arr, i+1,right);//遞迴右邊 }

void printarr(vector& arr, int len);

// srand(unsigned int)time(nullptr);

int k;

for( k = 0; k < n; k++)

cout<

參考:兩種**)

參考:**)

資料結構 排序演算法 快速排序

演算法描述 快速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 n log n 次比較。在最壞狀況下則需要 n2 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 n log n 演算法更快,因為它的內部迴圈 inner loop 可以在大部分的架構上很有效率地...

資料結構 快速排序演算法

一趟快速排序的演算法是 1 設定兩個變數i j,排序開始的時候 i 0,j n 1 2 以第乙個陣列元素作為關鍵資料,賦值給key,即key a 0 3 從j開始向前搜尋,即由後開始向前搜尋 j 找到第乙個小於key的值a j 將a j 和a i 互換 4 從i開始向後搜尋,即由前開始向後搜尋 i ...

c 演算法和資料結構 快速排序演算法

問題描述 快速排序演算法 描述 快速排序演算法 類名 quicksort public class quicksort while a i pivot i right 從左向右尋找大於支點元素 do while a j pivot j 0 從右向左尋找小於支點元素 if i j break else...