快速排序是由東尼·霍爾所發(fā)展的一種排序算法。在平均狀況下,排序 n 個(gè)項(xiàng)目要 Ο(nlogn) 次比較。在最壞狀況下則需要 Ο(n2) 次比較,但這種狀況并不常見。事實(shí)上,快速排序通常明顯比其他 Ο(nlogn) 算法更快,因?yàn)樗膬?nèi)部循環(huán)(inner loop)可以在大部分的架構(gòu)上很有效率地被實(shí)現(xiàn)出來。
(1)算法步驟
1. 從數(shù)列中挑出一個(gè)元素,稱為 “基準(zhǔn)”(pivot);
2. 重新排序數(shù)列,所有元素比基準(zhǔn)值小的擺放在基準(zhǔn)前面,所有元素比基準(zhǔn)值大的擺在基準(zhǔn)的后面(相同的數(shù)可以到任一邊)。在這個(gè)分區(qū)退出之后,該基準(zhǔn)就處于數(shù)列的中間位置。這個(gè)稱為分區(qū)(partition)操作;
3. 遞歸地(recursive)把小于基準(zhǔn)值元素的子數(shù)列和大于基準(zhǔn)值元素的子數(shù)列排序;
遞歸的最底部情形,是數(shù)列的大小是零或一,也就是永遠(yuǎn)都已經(jīng)被排序好了。雖然一直遞歸下去,但是這個(gè)算法總會(huì)退出,因?yàn)樵诿看蔚牡╥teration)中,它至少會(huì)把一個(gè)元素?cái)[到它最后的位置去。
(2)動(dòng)圖演示
(3)C語言代碼實(shí)現(xiàn)如下:
#include <stdio.h> #include <stdlib.h> /* 快速排序算法學(xué)習(xí) */ void swap(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; } void quickSort(int arr[] ,int start, int end) { int arrBase, arrMiddle; int tempStart = start, tempEnd = end; //對于這種遞歸的函數(shù),內(nèi)部必須要有一個(gè)函數(shù)返回的條件 if(tempStart >= tempEnd) return; //拷貝一個(gè)基準(zhǔn)值作為后面比較的參數(shù) arrBase = arr[start]; while(start < end) { while(start < end && arr[end] > arrBase) end--; if(start < end) { swap(&arr[start], &arr[end]); start++; } while(start < end && arr[start] < arrBase) start++; if(start < end) { swap(&arr[start], &arr[end]); end--; } } arr[start] = arrBase; arrMiddle = start; //分治方法進(jìn)行遞歸 quickSort(arr,tempStart,arrMiddle-1); quickSort(arr,arrMiddle+1,tempEnd); } int main() { int myArr[] = {12,13,15,20,0,-1,-10,100}; int arrLength = sizeof(myArr)/sizeof(int); quickSort(myArr,0,arrLength-1); for(int i = 0; i<arrLength; i++) printf("%5d",myArr[i]); return 0; }
如果我們編譯并運(yùn)行上述程序,那么它應(yīng)該產(chǎn)生以下結(jié)果:
-10 -1 0 12 13 15 20 100
1716 | 數(shù)據(jù)結(jié)構(gòu)-快速排序 |
2020 | 快速排序練習(xí) |
2214 | 藍(lán)橋杯算法提高-快速排序 |
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會(huì)寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進(jìn)階課程
從零到寫出一個(gè)爬蟲的Python編程課程
只會(huì)語法寫不出代碼?手把手帶你寫100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程