沒有物件也沒有new方法的大白
阿新 • • 發佈:2019-01-26
快速排序
- 核心思想:
快速排序就是立一個數作為基準數,比他小的統統放左邊,比他大的統統放在他的右邊,接著通過遞迴,對它的左邊序列,右邊序列重複此過程,直到無數可分
- 複雜度分析
- 最好情況:
O(nlogn)
- 最差情況:
O(n^2)
- 平均情況:
O(nlogn)
- 輔助空間:
O(logn)~O(n)
- 穩定性:
不穩定
- 最好情況:
圖解
如序列{6,1,2,7,9,3,4,5,10,8}
6作為基準數
,左右安排兩個哨兵i,j
哨兵i
碰到比6小的
就一路向右走(碰到比6大的就停下),哨兵j
碰到比6大的
,就一路向左走(碰到比6小的停下)
兩者都停下時就進行交換,交換後的效果如下
接著兩哨兵繼續走,
兩者都停下時便交換
直到兩者相遇
此時可以選擇和基準數交換位置
此時,以6為基準數的排序就完成了,接著以3為基準數重複此過程,再一下一個基準數重複,直到有序
完整過程如下圖
程式碼如下
#include <iostream>
void swap(int *&arr,int i,int j){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
int sortCore(int *arr,int start,int end){//快速排序
int i=start;
int j=end;
int temp=arr[start];
while(i!=j){//定義兩個一頭一尾的哨兵
while(arr[j]>temp){//尾哨兵從後往前掃描,碰到比基準數大的就往前走
j--;
}
while(arr[i]<temp){//頭哨兵從前往後掃,碰到比基準數小的往後走
i++;
}
swap(arr,i,j);
}
return i;
}
void quickSort(int *arr,int start,int end){
int i;
if(start<end){
i=sortCore(arr,start,end);
quickSort(arr,start,i-1);
quickSort(arr,i+1,end);
}
}
int main(int argc, char** argv) {
int arr[]={2,23,54,12,13,64,7,10};
quickSort(arr,0,7);
for(int i=0;i<8;i++){
printf("%d ",arr[i]);
}
return 0;
}