基本思想:在當前的序列(k1,k2,···,kn)中任意選取乙個元素,把該元素稱為基準元素或支點,把小於等於基準元素的所有元素都移到基準元素的前面,把大於基準元素的所有元素都移到基準元素的後面,這樣使得基準元素所處的位置恰好就是排序的最終位置,並且把當前參加排序的序列劃分為前後兩個子串行。其中,前面的子串行中的元素都小於等於基準元素,後面的子串行的元素都大於基準元素。接下來分別對這兩個子串行重複上述的排列操作(如果子串行的長度大於1),直到使得所有元素都被移動到排序後他們應處的最終的位置上。
快速排序優勢原因:快速排序方法之所以效率較高,是因為每一次元素的移動都是跳躍式的。因為每趟排序都要指定乙個基準點,把小於等於基準元素的所有元素都移到基準元素的前面,把大於基準元素的所有元素都移到基準元素的後面,這樣每次元素的移動就不會像氣泡排序那樣只能在相鄰元素之間進行,元素移動的間隔距離較大,因此總的比較和移動次數減少,排序的速度從而提高。
在排序的過程中,每次按照基準元素將原序列分為前後兩個子串行的過程成為一次劃分操作。一次劃分操作如下:
假設原序列為:。
首先設定兩個變數i和j。i=1,指向元素5;j=7,指向元素6.設定基準元素i指向的元素5:
↑ ↑
i j
(1)反覆執行i=i+1的操作,直到i指向的元素大於等於基準元素5,或者i指向序列尾部,即i=7為止。然後反覆執行j=j-1的操作,直到j指向的元素小於等於基準元素5,或者j指向序列的首部,即j=1為止:
↑ ↑
i=2 j=4
(2)若此時i=j,則將基準元素與j指向的元素交換位置:
↑ ↑j=3i=4
至此完成了原序列的第一次劃分,接下來分別遞迴地對基準點5前後的子串行中長度大於1的子串行重複執行上述操作,直到整個序列排序結束。
系列的每一次劃分操作都是按照:(1)→(2)→(1)···(2)→(1)→(3)→結束,這樣的過程進行的。也就是說,只有當i>=j時才將本次劃分的基準元素放置到它最終的位置上。
進行完序列的一次劃分後,再對基準元素5前後的兩個子串行分別重複上述的操作。對於每個子串行的操作又是一次劃分的過程,每次劃分元素的基準元素仍可設定為該子串行的第乙個元素
快速排序的遞迴演算法如下:
void sort(keytype k,int s,int t)
的快速排序,要求從大到小,並輸出排序後的數列元素。
【分析】
前面介紹的快速排序演算法只適用於序列的從小到大的排序,在這裡要實現序列的從大到小的排序,因此上述演算法要稍加修改。
#includevoid swap(int *a,int *b)//序列中元素的交換
void sort(int k,int s,int t)//快速排序
while(!(k[s]<=k[j]||j==s));//將j向序列首部移動
if(i
排序 快速排序
快速排序時實踐中最快的一直排序,平均時間是0 nlogn 最壞的情況是o n2 但是很容易將這種情況避免 空間複雜度 o n lgn 不穩定。快速排序時基於分治模式處理的,對乙個典型子陣列a p.r 排序的分治過程為三個步驟 1.分解 a p.r 被劃分為倆個 可能空 的子陣列a p q 1 和a ...
排序 快速排序
定義 在快速排序演算法中,使用了分治策略,將要排序的序列分成兩個子串行,然後遞迴地對子序列進行排序,直到整個序列排序完畢。步驟 1.在序列中選擇乙個關鍵元素作為軸 2.對序列進行重新排序,將比軸小的元素移到軸的前邊,比軸大的元素移動到軸的後面。在進行劃分之後,軸便在它最終的位置上 3.遞迴地對兩個子...
排序 快速排序
時間複雜度 快速排序每次將待排序陣列分為兩個部分 1 在理想狀況下,每一次都將待排序陣列劃分成等長兩個部分,則需要logn次劃分。2 在最壞情況下,即陣列已經有序或大致有序的情況下,每次劃分只能減少乙個元素,快速排序將不幸退化為氣泡排序,最壞情況為o n 2 快速排序的平均時間複雜度為o nlogn...