快速排序
递归的办法
随机数,保证不超时
#include<iostream>
#include<cstdlib> //表示随机数
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 rand_idx = l + rand()%(r-l+1);
swap(q[l],q[rand_idx]);
int i = l - 1,j = r + 1;
int x = q[l];
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()
{
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;
}
取中间值
#include<iostream>
//#include<cstdlib> //表示随机数
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 rand_idx = l + rand()%(r-l+1);
int mid = (l + r)/2;
swap(q[l],q[mid]);
int i = l - 1,j = r + 1;
int x = q[l];
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()
{
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;
}
前面两者都是用递归实现的,但是要明白快速排序是先移动右指针再移动左指针的,顺序是有讲究的,然而这里并没有按这个区分,因为在快速排序中,上面的代码没有严格规定移动, 那么没有先移动左指针的顺序的原因是基准值的优化和对称逻辑设计使得左右指针顺序不重要, 那么在实现先移动左指针通常会把最左侧的作为基准值,这样右指针更容易 找到基准值小的元素,便于第一次交换
带库函数的快速排序
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
int n;
cout << "请输入数组长度: ";
cin >> n;
vector<int> arr(n);
cout << "请输入数组元素: ";
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
cout << "排序前的数组: ";
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << endl;
// 使用 std::sort 排序
sort(arr.begin(), arr.end());
cout << "排序后的数组: ";
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
这是一个带库函数的快速排序,明显是简单不少吧
不带库函数的快速排序
#include <iostream>
#include <vector>
#include <algorithm> // 为了使用 std::swap
using namespace std;
// 快速排序函数
void quick_sort(vector<int>& arr, int left, int right) {
if (left >= right) return;
// 选择基准值,这里选择最左边的元素
int pivot = arr[left];
int i = left, j = right;
while (i < j) {
// 右指针找到小于 pivot 的值
while (i < j && arr[j] >= pivot) j--;
if (i < j) arr[i++] = arr[j];
// 左指针找到大于 pivot 的值
while (i < j && arr[i] <= pivot) i++;
if (i < j) arr[j--] = arr[i];
}
// 将基准值放到合适的位置
arr[i] = pivot;
// 递归处理左子数组和右子数组
quick_sort(arr, left, i - 1);
quick_sort(arr, i + 1, right);
}
int main() {
int n;
cin >> n;
vector<int> arr(n);
// 输入数组元素
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
cout << "原先的数组:" << endl;
for (int i = 0; i < n; i++) {
cout << arr[i] << ' ';
}
cout << endl;
// 调用快速排序函数
quick_sort(arr, 0, n - 1);
cout << "排序后的数组:" << endl;
for (int i = 0; i < n; i++) {
cout << arr[i] << ' ';
}
cout << endl;
return 0;
}
这个就是涉及先移动右指针再左指针了 大体上就是这几种做法,主要思想是递归, 如果觉得总结的不错的话就点个关注吧,大一水平有限,请多多包涵