快速排序(分治思想)
一、步骤
1.确定分界点:q[l],q[(l+r)/2],q[r],随机一点
2.调整区间:<=x的值放左边,>=x的放右边
3.递归处理左右两段
二、暴力算法
开两个数组,将q数组中的元素>=x放a数组,<=x放b数组,最后把a,b两个数组依次插入到q数组中
三、代码
#include<iostream>
using namespace std;
const int N = 1e6 + 10;
int n;
int q[N];
void quick_sort(int q[], int l, int r)
{
if (l >= r)return;
int x = q[l], i = l - 1, j = r + 1;//保证使指针先向中间移动一格,再做判断;
while (i < j)
{
do i++; while (q[i] < x);
do j--; while (q[j] > x);
if (i < j)swap(q[i], q[j]);
}
/*递归处理左右两段*/
quick_sort(q, l, j);
quick_sort(q, j + 1, r);
}
int main()
{
scanf_s("%d", &n);
for (int i = 0; i < n; i++)scanf_s("%d", &q[i]);
quick_sort(q, 0, n - 1);
for (int i = 0; i < n; i++)printf("%d ", q[i]);
return 0;
}