快速排序可以分解為三步:
尋找基準數,比較通常就是選擇待排序的首專案或者中間專案;
2.根據與基準數的大小關係, 將待排序陣列分成兩個子串行:
和。其中
均小於基準數,
均大於基準數,這樣基準數的位置就確定了在q處。
然後利用遞迴對兩個子串行進行排序。
下圖是對步驟2的介紹,只是該圖是將基準元素設定為最後乙個元素,i和j的意義分別是,j作為遍歷指標遍歷從左往右遍歷陣列,i記錄小於等於基準元素的位置,當j指向的元素小於等於基準元素時,就交換(i+1)和j指向的元素,同時i++。當j指向最後基準元素時,交換(i+1)和j指向元素的位置,返回i就是上面提到的q:
另外一種方法是,基準元素指向首專案,然後i和j分別指向首專案和尾專案。j先從右向左遍歷,直至遇到某專案小於等於基準元素,交換i和j指向的專案大小;然後i從從左向右遍歷,直至遇到某個專案大於基準元素,交換i和j指向的專案大小。當i和j相等時,停止遍歷,返回i或者j就是上面提到的q。下面的code是我按照原理二寫的。
#include
using
namespace
std;
int quicksort(int* p,int start,int end)
if(flag)
j--;
if(p[i]>tmp&&(!flag))
if(!flag)
i++;
}p[i]=tmp;
return i;
}void quicksort(int* p,int start,int end)
}int main()
; quicksort(data,0,9);
for(int i=0;i
cout
<
<
0;}
code可以進行優化:
int quicksort(int* p,int start,int
end)
int quicksort(int* p, int start, int end)
}return
index;
}
效能分析時間複雜度:就平均效能而言,快速排序被認為是目前最好的一種內部排序,通常快排的平均時間複雜度是ω(
nlog
(n))
,但是若待排序陣列已經排序好了,或者幾乎是有序的,那麼快速排序將退化為氣泡排序,時間複雜度ω(
n2) 。所以這種情況一般會先隨機打亂陣列或者隨機選擇基準元素的位置。
空間複雜度:最壞情況下,若每趟排序之後,樞軸位置均偏向子串行的一端(有序),棧的最大深度為ω(
n)。如果在一趟劃分之後比較分割所得兩部分的長度,且先對長度短的子串行中的記錄進行快速排序,則棧的最大深度可降為ω(
logn
) 。
快速排序是不穩定排序,就拿最後的實現方式來說明,快排只能保證從待排序陣列的左邊界到基準元素的位置之間的元素是穩定的,但是無法保證從基準元素的位置到待排序陣列的右邊界是穩定的。
排序演算法之快速排序 5
找到乙個比標準數小的 array low array high 如果左邊的數比標準數大,則low右移一位 while low high stand array low 找到乙個比標準數大的 array high array low 將標準數替換掉重合的數 array low stand 2,1,3,...
排序演算法5 快速排序
1.什麼是快速排序 快速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 nlogn 次比較。在最壞狀況下則需要 n 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 nlogn 演算法更快,因為它的內部迴圈 inner loop 可以在大部分的架構上很有效 率地...
排序演算法5 快速排序
快速排序是對氣泡排序基礎上的優化版本,它打破了氣泡排序只能比對交換相鄰元素的方式,並加入了 分治 思想 1 對一串行,選定最左邊的元素作為基數p 再定義i,使i依次從左到右尋找比基數p大的元素 再定義j,使j依次從右到左尋找比基數p小的元素 當i j每每找到,便交換i j元素,直到i j相遇 2 將...