快速排序分析總結

2021-07-11 21:33:29 字數 1269 閱讀 1659

快速排序演算法和歸併排序類似,都是屬於分治演算法。

快速排序使用分治法(divide and conquer)策略來把乙個序列(list)分為兩個子串行(sub-lists)。

步驟為:

從數列中挑出乙個元素,稱為 「基準」(pivot),

重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割槽退出之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作。

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

雖然快速排序是分治演算法,但其中主要的操作是分割槽操作,這個操作的複雜性應該是線性的。劃分的實現由很多種,樸素的實現是選取第乙個元素和最後乙個元素作為基準作為劃分。演算法導論一書給出的partition 函式是取最後乙個元素作為基準,然後通過一遍迴圈交換元素。**雖然簡潔,但是初看起來不太易懂,建議在紙上模擬下過程。此種方法相對來說交換元素的次數也比較多,後面會給出一種優化的操作。

/* 快速排序樸素的實現 */

#include

void swap(int* a, int* b)

/*取最後乙個作為基準 */

int partition (int arr, int l, int h)

}swap(&arr[i + 1], &arr[h]);

return (i + 1);//返回基準元素的最終位置

}/* arr --> 待排序陣列, l --> 開始位置, h -->結束位置 */

void quicksort(int arr, int l, int h)

}/* 列印陣列 */

void printarray(int arr, int size)

// 測試

int main()

; int n = sizeof(arr)/sizeof(arr[0]);

quicksort(arr, 0, n-1);

printf("sorted array: \n");

printarray(arr, n);

return

0;}

輸出:

sorted array:15

78910

時間複雜度可以算出為時間的複雜度可以表示為:t(n) = t(k) + t(n-k-1) + p(n)

雖然快速排序的最壞情況下複雜度為o(n^2),這比很多其他的排序演算法,如歸併排序和堆排序,在實踐中更快.

排序演算法 快速排序(直觀總結分析)

快速排序演算法是比較經典的排序演算法。但其中心思想還是比較簡單的,就是 挖坑 和 填坑 的過程。這裡的 坑 經常會被隨機化,以防止快排的最壞情況出現。當然,我們拿到乙個數列後,也可以先將該數列整體隨機化,從而避免每次都要隨機 選坑 今天重新複習了一下,也總結了不同形式的快排 總結如下 1.常見的快速...

快速排序分析

1.開篇 終於還是忍不住要學習一下演算法啦,該面對的還是要面對,不能逃避,不能把已經會的技能忘掉,那是一種對生命的摧殘和不仁。不要怕,只要每天都在進步,水滴石穿,終有破雲見天日的時刻。感慨寫完了,回到正題,分析快速排序。2.原理 假設要排序的陣列是a 0 a n 1 首先任意選取乙個資料 通常選用陣...

快速排序分析

首先簡單描述一下快速排序 1.快速排序樹不穩定的 由於關鍵字的比較與交換是跳躍進行的 2.時間複雜度為o n logn 最好情況為n logn 若陣列基本有序為n n 3.空間複雜度為logn 主要是遞迴造成的棧空間的使用,最好情況,遞迴樹的深度為log2n,其空間複雜度也就為o logn 最壞情況...