一、方法
核心市分治
定基准,设置两个指针,从右边开始,如果遇到比基准小的就和左边的交换,之后从左边找,遇到比基准大的就和右边的交换,直到两指针相遇,将基准放入相遇位置,该位置前面都比基准小,后面都比基准大
二、时间空间复杂度
时间复杂度:
最坏情况下,时间复杂度是O(n^2);
最优情况下,时间复杂度是O(nlogn);
平均时间复杂度是O(nlogn);
空间复杂度:O(logn),递归调用
三、代码实现优化
1.递归
int Partion(vector<int>& s, int left, int right) {
int tmp = s[left];
while (left < right) {
while (left < right && s[right] > tmp) --right;
if (left < right) s[left] = s[right];
while (left < right && s[left] <= tmp) left++;
if (left < right) s[right] = s[left];
}
s[left] = tmp;
return left;
}
void sort_s(vector<int>& s, int left, int right) {
if (left < right) {
int pos = Partion(s, left, right);
sort_s(s, left, pos - 1);
sort_s(s, pos + 1, right);
}
}
int main() {
vector<int> s = { 1,4,6,23,8 };
sort_s(s, 0 ,s.size() - 1);
for (int i = 0; i < s.size(); ++i) {
cout << s[i]<<" ";
}
return 0;
}
2.非递归
int Partion(vector<int>& s, int left, int right) {
int tmp = s[left];
while (left < right) {
while (left < right && s[right] > tmp) --right;
if (left < right) s[left] = s[right];
while (left < right && s[left] <= tmp) left++;
if (left < right) s[right] = s[left];
}
s[left] = tmp;
return left;
}
void sort_s(vector<int>& s, int left, int right) {
queue<int> qu;
qu.push(left);
qu.push(right);
while (!qu.empty()) {
left = qu.front();
qu.pop();
right = qu.front();
qu.pop();
int pos = Partion(s, left, right);
if (left < pos - 1) {
qu.push(left);
qu.push(pos - 1);
}
if (pos + 1 < right) {
qu.push(pos + 1);
qu.push(right);
}
}
}
3优化,三位取中
int Mid_num(vector<int>& s, int left, int right) {
int mid = (left + right )>> 1;
if (s[left] > s[mid]) {
if (s[left] > s[right]) {
if (s[mid] > s[right]) {
return mid;
}
else {
return right;
}
}
else {
return left;
}
}
else {
if (s[left] < s[right]) {
if (s[mid] < s[right]) {
return mid;
}
else {
return right;
}
}
else {
return left;
}
}
}