#include<iostream>
using namespace std;
const int N = 100;
int q[N];
int n;
void quick_sort(int q[], int l, int r)
{
//递归的终止情况,一定要注意边界问题
if (l >= r) return;
//第一步:分成子问题
int i = l - 1, j = r + 1, x = q[l + r >> 1];
/*
>> 这是二进制里面的右移位操作符,相当于除于2取整,那么同理,
<< 左移操作符相当于乘以2取整
1、那么为什么这里面的i和j都这样定义他们的值?
是因为我们在接下来的划分子问题的代码中,用到的是do while 循环,就是不论
条件是否成立,i,j都会向后,向前移动一个位置。
2、这个的移动是先去移动i指针,当我们发现如果q[i]的值如果大于x的话,再去移动j指针,找到一个小于x的值,
这时都从do while 循环里面跳了出来,如果这时i<j,说明,我们还没有划分成功,只需要交换q[i],q[j]的值
继续循环下去,直到i=j,跳出外层while循环。
3、紧接着我们去递归子问题即可得到最终的排序结果
*/
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_s("%d\t", q[i]);
}
}
看明白之后,点个赞,嘿嘿!!
|