首先快排是一種比較排序。
具體思想是 選出乙個基準值,通過比較找出待排序區間中基準值該放置的位置。
實現邏輯:
通常有三種方式來進行基準數的左右分區。
左右指標法。
挖坑法前後指標法。
左右指標實現:
//左右指標法
intpartsort
(int
* a,
int begin,
int end)
while
(begin < end && a[end]
>= key)
swap
(a[begin]
, a[end]);
}swap
(a[begin]
, a[index]);
return begin;
}
挖坑法實現:
//挖坑法
intpartsort2
(int
* a,
int begin,
int end)
a[end]
= a[begin]
;while
(a[begin]
< a[end]
&& a[end]
>= key)
a[begin]
= a[end];}
a[begin]
= key;
return begin;
}
前後指標法實現:
//前後指標法 思路cur一直向前走遇到小的就置換到前面 這樣一來 一次迴圈 就達到目的
intpartsort3
(int
* a,
int begin,
int end)
++cur;
}++prev;
swap
(a[prev]
, a[end]);
return prev;
}
遞迴:
void
quicksort
(int
* a,
int begin,
int end)
int mid =
partsort
(a, begin, end)
;//也可以寫進函式內部
quicksort
(a, begin, mid-1)
;quicksort
(a, mid+
1, end)
;}
迭代:
void
quickofstack
(int
* a,
int n)
if(mid+
1< end)
}}
空間複雜度,主要是遞迴造成的棧空間的使用,最好情況,遞迴樹的深度不深
其空間複雜度也就為 o(logn),
最壞情況,
需要進行n‐1遞迴呼叫,其空間複雜度為o(n),
平均情況,
空間複雜度也為o(logn)。
快排的平均時間複雜度是o(nlogn), 但是最壞的情況下,也就是有序的情況下回達到n^2的複雜度,因此我們考慮快排進行優化。為了避免有序情況下每次都取到最大值或者最小值。因此提出了三數取中的方法。
int
selectmid
(int
* a,
int begin,
int end)
else
if(a[mid]
>= a[begin]
&& a[begin]
>= a[end]
)return end;
}
穩定性: 快排是一種不穩定的演算法。
時間複雜度:o(nlogn)
空間複雜度:o(logn)
手寫快排 遞迴實現 棧迭代實現
快排思想 選取乙個記錄作為樞軸,經過一趟排序,將整段序列分為兩個部分,其中一部分的值都小於樞軸,另一部分都大於樞軸。然後繼續對這兩部分繼續進行排序,從而使整個序列達到有序。實現 演算法 1.選取乙個中樞key,2.將陣列,小於key的放左邊,大於key的放右邊 3.最後將key放到這個分成2組的中間...
快排非遞迴實現
int partition int arr,int low,int high arr low pivot return low void non recursive qsort int arr,int low,int high if high pivot 1 其實就是用棧儲存每乙個待排序子串的首尾元...
快速排序(快排 遞迴實現)
時間複雜度 o nlogn 注意 1 時間複雜度與pivot的選取有關,最好能選到正中間 2 該排序不是穩定排序 1.0 不用swap函式 相較2.0節省時間 int qsort int l,int r s l pivot return l 2.0 用swap函式int qsort int l,in...