这段代码实现了一个快速排序算法,用于对一个数组进行排序。快速排序是一种高效的排序算法,平均时间复杂度为 O(n log n)。以下是代码的详细思路解析:
1. 问题背景
给定一个包含 n
个整数的数组,目标是将数组中的元素按升序排列。
2. 快速排序算法的概念
快速排序是一种分治算法,通过选择一个“基准”(pivot),将数组分为两部分,一部分包含小于基准的元素,另一部分包含大于基准的元素。然后递归地对这两部分进行排序,最终得到一个有序数组。
3. 代码逻辑解析
(1) 快速排序函数
void quick_sort(int q[], int l, int r)
{
if (l >= r) return; // 如果区间只有一个数或者没有数,直接返回
int x = q[l], i = l - 1, j = r + 1; // 选择分界点 x 和初始化两个指针
while (i < j)
{
do i++; while (q[i] < x); // 找到第一个大于等于 x 的元素
do j--; while (q[j] > x); // 找到第一个小于等于 x 的元素
if (i < j) swap(q[i], q[j]); // 交换两个元素
}
quick_sort(q, l, j); // 递归排序左区间
quick_sort(q, j + 1, r); // 递归排序右区间
}
-
输入:数组
q
,左边界l
和右边界r
。 -
逻辑:
-
基准选择:
-
选择左边界
l
的元素q[l]
作为基准x
。
-
-
初始化指针:
-
初始化两个指针
i
和j
,分别从左边界和右边界开始。
-
-
分区操作:
-
使用
do-while
循环,移动指针i
和j
,直到找到需要交换的元素。 -
当
i < j
时,交换q[i]
和q[j]
。
-
-
递归排序:
-
递归调用
quick_sort
对左区间[l, j]
和右区间[j + 1, r]
进行排序。
-
-
(2) 主函数
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n;
for (int i = 0; i < n; i++) cin >> q[i]; // 输入数组
quick_sort(q, 0, n - 1); // 调用快速排序函数
for (int i = 0; i < n; i++) cout << q[i] << " "; // 输出排序后的数组
-
输入优化:
-
使用
ios::sync_with_stdio(0)
和cin.tie(0)
提高输入输出效率。
-
-
输入数组:
-
输入数组的长度
n
和数组元素。
-
-
调用快速排序:
-
调用
quick_sort
函数对数组进行排序。
-
-
输出结果:
-
输出排序后的数组。
-
4. 示例运行
输入:
5
3 1 4 1 5
运行过程:
-
输入数组长度
n = 5
。 -
输入数组:
3 1 4 1 5
。 -
调用
quick_sort
函数对数组进行排序:-
选择基准
x = 3
,初始化指针i = -1
和j = 5
。 -
分区操作:
-
i
移动到1
,j
移动到4
,交换1
和4
。 -
i
移动到3
,j
移动到1
,交换3
和1
。 -
最终
i = 2
,j = 2
,分区完成。
-
-
递归排序左区间
[0, 2]
和右区间[3, 4]
。
-
-
输出排序后的数组:
1 1 3 4 5
输出:
1 1 3 4 5
5. 总结
这段代码的核心思路是通过快速排序算法对数组进行排序。快速排序是一种高效的排序算法,平均时间复杂度为 O(n log n),适用于大规模数据的排序。
完整代码
#include<bits/stdc++.h>
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;//区间只有一个数或者没有数直接return
int x=q[l],i=l-1,j=r+1;//分界点x和两个指针
while(i<j)
{
do i++ ; while(q[i]<x);//q[i]小于等于x,指针后移
do j-- ; while(q[j]>x);//q[i]大于等于x,指针前移
if(i<j) swap(q[i],q[j]);
}
quick_sort(q,l,j);//递归左区间
quick_sort(q,j+1,r);//递归右区间
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=0;i<n;i++) cin>>q[i];
quick_sort(q,0,n-1);
for(int i=0;i<n;i++) cout<<q[i]<<" ";
return 0;
}