快速排序使用分治法(divide and conquer)策略來把乙個序列(list)分為兩個子串行(sub-lists)。
步驟為:
從數列中挑出乙個元素,稱為"基準"(pivot),
重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割槽結束之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作。
遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。
遞迴的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞迴下去,但是這個演算法總會結束,因為在每次的迭代(iteration)中,它至少會把乙個元素擺到它最後的位置去。by the way,快速排序的時間複雜度為(nlogn).
下面為c語言**:
#include#define maxsize 100
struct datatype
;struct sqlist
;//尋找基準的放入位置
int partition(sqlist *l,int left,int right)
if(leftr[left] = l->r[right];
left++;
} //從左向右開始查詢第乙個大於哨點的數
while(leftr[left].data <= l->r[0].data)
if(leftr[right] = l->r[left];
right--;
} //測試或者便於理解使用**
/*printf("\n檢視該趟排序結果:\n");
for(int i=0;ilength;i++)
printf(" left=%d right=%d \n",left,right);
*/} //將基準送至準確的位置(左邊的數比它小,右邊的數比它大)
l->r[left] = l->r[0];
return left;
}//快速排序
有什麼意見或者建議,讀者可以給我說說,大家一塊進步。thanks.
C語言實現快速排序
快速排序,是氣泡排序的改進,通過尋找 中間元素 在一趟排序中,把比 中間元素 小的數放到左邊,比 中間元素 大的數放到右邊,如此遞迴,最終得到排序結果。include define num 5 void quick sort int a,int left,int right void swap in...
快速排序 C語言實現
以前使用rm時,ruby指令碼提供乙個sort函式,可以把陣列進行排序,後來得知採用的演算法是快速排序。隨著資料結構課程的學習,快速排序如今也不再神秘,如下 using namespace std void quicksort int a,int low,int high int first low...
C語言實現快速排序
快速排序 方法 從左邊開始找比基準值大的元素,從右邊找比基準值小的元素,交換兩個元素 缺點 如果所給元素序列為逆序的,那麼快速排序的時間複雜度很糟糕。長序列對遞迴排序來說不友好。時間複雜度 平均o nlogn 最壞o n 空間複雜度 最壞o n 穩定性 不穩定排序 int quicsort int ...