先排序找到中间变量位置,然后分治
1 中间变量会被移动,但最后还是会找到中间变量的左右位置
#include <cstdio>
#include <algorithm>
void quickSort(int *array, int left, int right) {
int mid = array[(right + left)/2];
int i = left, j = right;
while (i <= j) {
while (array[i] < mid) i++;
while (array[j] > mid) j--;
if (i <= j) {
std::swap(array[i], array[j]);
i++;
j--;
}
}
if (left < j) quickSort(array, left, j);
if (i < right) quickSort(array, i, right);
}
const int MAX_N = 1E9;
int a[MAX_N];
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
}
quickSort(a, 0, n - 1);
for (int i = 0; i < n; ++i) {
printf("%d ", a[i]);
}
return 0;
}
2 中间变量不变,直到找到他应该的位置再交换
#include <cstdio>
#include <algorithm>
void quickSort(int *array, int left, int right) {
if (left >= right) return;
int mid = (right + left)/2;
std::swap(array[left], array[mid]);
int i = left, j = right;
while (i < j) {
while (i < j && array[j] >= array[left]) j--;
while (i < j && array[i] <= array[left]) i++;
if (i < j) std::swap(array[i], array[j]);
}
std::swap(array[left], array[i]);
quickSort(array, left, i - 1);
quickSort(array, i + 1, right);
}
const int MAX_N = 1E9;
int a[MAX_N];
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
}
quickSort(a, 0, n - 1);
for (int i = 0; i < n; ++i) {
printf("%d ", a[i]);
}
return 0;
}