排序方法(二)快速排序

2021-09-09 09:18:18 字數 1969 閱讀 2778

使用語言:c語言,編譯器visual studio 2017

一.基本思想

假設由小到大排序。則快速排序的基本思想是,用乙個左指標(或下標)記錄最左邊的數,用乙個右指標記錄最右邊的數。選取乙個數作為基數(隨機取即可,我取的是第乙個數),實現基數左邊的都不大於基數,基數右邊的都不小於基數,再遞迴地分別對基數左右的數進行快速排序,最後得到排序完畢的序列。具體實現過程:

(1)設陣列為array,設左下標為i,右下標為j,以array[i]為基數;

(2)首先j向左遍歷,找到不大於基數的數就停止;

(3)i向右遍歷,找到不小於基數的數就停止;

(4)交換array[i]和array[j]的位置,交換後基數需要設定成array[j];//這樣確保基數是同乙個數

(5)迴圈執行(2)、(3)、(4),直到i和j相等。

二.**實現

#includeusing namespace std;

void swap(int i, int j, int array)

//left向右查詢不小於基準的數;right向左查詢不大於基準的數

void quicksort(int left,int right, int array)

swap(i, j, array);

base = array[j];

while (i < j&&array[i] <= base)

swap(i, j, array);

base = array[i];

} quicksort(left, i - 1, array);

quicksort(i + 1, right, array);

}int main()

{ int array[100];

int i = 0;

int j = 0;

int num = 0;

printf("請輸入待排序的數字個數:\n");

scanf_s("%d", &num);

printf("請輸入%d個數字:\n", num);

for (i; i三.時間複雜度分析

這裡參考部落格surgewong的部落格

當基數不能很好的分割序列,比如分割後的兩個序列分別擁有1個和n-1個元素,那麼快速排序就退化成氣泡排序,這是最差的情況,時間複雜度為o(n^2)。

設t(n)為對n個記錄進行排序所需要的時間,則每當乙個記錄得到其正確位置,整組大致分成兩個相等的兩部分時,我們得到快速排序演算法的最佳時間複雜性:

t(n) <= cn + 2t(n/2) c是乙個常數

<= cn + 2(cn/2+2t(n/4)) = 2cn+ 4t(n/4)

<= 2cn + 4(cn/4+ 2t(n/8)) = 3cn + 8t(n/8)

<= cnlogn + nt(1) = o(nlogn) 其中cn 是一次劃分所用的時間,c是乙個常數

最壞的情況,每次劃分都得到乙個子串行,時間複雜度為:

t(n) = cn + t(n-1)

= cn + c(n-1) + t(n - 2) = 2cn -c + t(n-2)

= 2cn - c + c(n-2) + t(n-3)= 3cn - 3c + t(n-3)

= c[n(n+1)/2-1] + t(1) = o(n2)

快速排序的時間複雜度在平均情況下介於最佳與最差情況之間,假設每一次分割時,基準值處於最終排序好的位置的概率是一樣的,基準值將陣列分成長度為0 和 n-1,1 和 n-2,……的概率都是 1/n。在這種假設下,快速排序的平均時間複雜性為:

t(n) = cn + 1/n(t(k)+ t(n-k-1)) t(0) = c, t(1) = c

這是乙個遞推公式,t(k)和t(n-k-1)是指處理長度為 k 和 n-k-1 陣列是快速排序演算法所花費的時間, 根據公式所推算出來的時間為 o(nlogn)。因此快速排序的平均時間複雜性為o(nlogn)。

排序(二) 快速排序 堆排序

一 排序分析 5 快速排序 時間複雜度 o nlog2n 有序 o n 2 空間複雜度 o log2n 演算法穩定性 不穩定 快速排序 分割槽 遞迴操作 固定位置選取基準法low 隨機選取 有序資料的優化 三分選取 優化 1 直接插入 少於100各元素 2 聚集基準位置法 取基準 分資料段 1 lo...

快速排序(二)

接著上面的文章 後面 的是優化這段 的問題 以下是總 劃分 author administrator public class requicsort public void insert int number public void display public int partition int ...

排序方法,合併排序 快速排序

function mergesort myarray var middle math.floor myarray.length 2 left myarray.slice 0,middle right myarray.slice middle params merge mergesort left m...