快速排序 #
q[l] — q[(l+r)/2] — q[r]
- 分治算法, the divide and conquer class of algorithm
- 确定分界点 x, q[l] q[(l+r)/2] q[r] q[random]
- 根据 x 调整元素, 使得 <=x, x, >=x
- 递归处理, 得到 left, x, right
implement 1 #
- a[], b[]
- for q[l - r] if q[i] <= x, x->a[] if q[i] >= x, x->b[]
- a[]->q[], b[]->q[]
implement 2 two pointers #
- pointers,p1, p2, 从序列两端相向而行
- p1 <= x, p1 移动到下一个,否则 判断 p2
- p2 >= x, p2 移动到下一个,否则 交换 p1 p2
#include <iostream>
using namespace std;
const int N = 1e6 + 10;
int n;
int arr[N];
void quick_sort(int arr[], int low, int high)
{
if (low >= high) return;
int pivot = arr[low], left = low - 1; right = high + 1;
while (left < right) {
do left++; while (arr[left] < pivot);
do right--; while (arr[right] > pivot);
if (left < right) swap(arr[left], arr[right]);
}
quick_sort(arr, low, high);
quick_sort(arr, right + 1, high);
}
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++) scanf("%d", &q[i]);
quick_sort(q, 0, n - 1);
for (int i = 0; i < n; i++) printf("%d ", q[i]);
int arr[] = { 24, 8, 42, 75, 29, 77, 38, 57 };
// Sorted array: 8 24 29 38 42 57 75 77
return 0;
}