排序演算法5 快速排序

2021-10-25 06:24:17 字數 2656 閱讀 6545

1.什麼是快速排序

快速排序是由東尼·霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 ο(nlogn) 次比較。在最壞狀況下則需要 ο(n²) 次比較,

但這種狀況並不常見。事實上,快速排序通常明顯比其他 ο(nlogn) 演算法更快,因為它的內部迴圈(inner loop)可以在大部分的架構上很有效

率地被實現出來。

快速排序使用分治法(divide and conquer)策略來把乙個序列(list)分為兩個子串行(sub-lists).快速排序又是一種分而治之思想

在排序演算法上的典型應用。本質上來看,快速排序應該算是在氣泡排序基礎上的遞迴分治法。

快速排序的名字起的是簡單粗暴,因為一聽到這個名字你就知道它存在的意義,就是快而且效率高,它是處理大資料最快的排序演算法之一了.

雖然最壞情況下的時間複雜度達到了 o(n²),但是快速排序似乎比較優秀,在大多數情況下都比平均時間複雜度為 o(nlogn) 的排序演算法表

現要更好,可是這是為什麼呢,經網友查了n多資料終於在《演算法藝術與資訊學競賽》上找到了滿意的答案:快速排序的最壞運**況是 o(n²),

比如說順序數列的快排。但它的平攤期望時間是 o(nlogn),且 o(nlogn) 記號中隱含的常數因子很小,比複雜度穩定等於 o(nlogn) 的歸併

排序要小很多。所以,對絕大多數順序性較弱的隨機數列而言,快速排序總是優於歸併排序。

--引用自

2. 排序演算法步驟

1.從數列中挑出乙個元素,稱為 "基準"(pivot);

2.重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。

在這個分割槽退出之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作;

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

拓展:pivot 英 [ˈpɪvət] 美[ˈpɪvət]

n.支點; 樞軸; 中心點; 最重要的人(或事物); 中心; 核心;

v.(使)在樞軸上旋轉(或轉動) ;

3.快速排序實現及其他排序方法效能比較測試

/*

檔名:performtest.c

編碼目的:簡單測試冒泡,希爾及快速排序演算法的效率

測試環境:mircosoft visual studio professional 2015 版本14.0.25431.01 update3

版本資訊:ver1.0

*/#include #include #include #include #include #include #define max 50000

void printarr(int arr, int length)

printf("\n");

}long getsystemtime()

// 快速排序

void quicksort(int arr, int start, int end)

// 填坑

if (i < j)

// 從左向右,找比基準數大的數

while (i < j && arr[i] < temp)

// 填坑

if (i < j)

}// 把基準數放到i位置

arr[i] = temp;

quicksort(arr, start, i - 1);

quicksort(arr, i + 1, end); }}

// 從小到大排序 希爾排序

void shellsort(int arr, int length)

arr[k + increasement] = temp;}}

} } while (increasement > 1);

}void swap(int *a, int *b)

void bubblesort(int arr, int length)

} }}int main(void)

//printf("排序前:\n");

long t_start_1 = getsystemtime();

//printarr(arr, max);

shellsort(arr, max);

//printf("排序後:\n");

long t_end_1 = getsystemtime();

//printarr(arr, max);

long t_insert_start_1 = getsystemtime();

quicksort(arr1, 0,max-1);

//printf("排序後:\n");

long t_insert_end_1 = getsystemtime();

//printarr(arr1, max);

long t_bubble_start_1 = getsystemtime();

bubblesort(arr, max);

long t_bubble_end_1 = getsystemtime();

//printarr(arr, max);

}

4.測試結果

排序演算法5 快速排序

快速排序是對氣泡排序基礎上的優化版本,它打破了氣泡排序只能比對交換相鄰元素的方式,並加入了 分治 思想 1 對一串行,選定最左邊的元素作為基數p 再定義i,使i依次從左到右尋找比基數p大的元素 再定義j,使j依次從右到左尋找比基數p小的元素 當i j每每找到,便交換i j元素,直到i j相遇 2 將...

排序演算法5之快速排序

快速排序可以分解為三步 尋找基準數,比較通常就是選擇待排序的首專案或者中間專案 2.根據與基準數的大小關係,將待排序陣列分成兩個子串行 和。其中 均小於基準數,均大於基準數,這樣基準數的位置就確定了在q處。然後利用遞迴對兩個子串行進行排序。下圖是對步驟2的介紹,只是該圖是將基準元素設定為最後乙個元素...

排序演算法之快速排序 5

找到乙個比標準數小的 array low array high 如果左邊的數比標準數大,則low右移一位 while low high stand array low 找到乙個比標準數大的 array high array low 將標準數替換掉重合的數 array low stand 2,1,3,...