GESP语法知识(快速排序)
参考程序1(基点选择为中点):
#include<iostream>
using namespace std;
int a[101];
void qsort(int l,int r)
{
if (l >= r) return;
int i,j,mid,p;
i=l;
j=r;
mid=a[(l+r)/2]; //选取中间位置作为分隔数
do
{
while(a[i]<mid) i++;
while(a[j]>mid) j--;
//若找到一组与排序不一致的数对,交换它们
if(i<=j)
{
p=a[i];a[i]=a[j];a[j]=p;
i++;j--;
}
} while(i<=j) ; //注意这里不要少了等号
if(l<j) qsort(l,j); //若未到边界,继续递归搜索左右区间
if(i<r) qsort(i,r);
}
int main()
{
int n,i;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i]; //输入数组
qsort(1,n);
for(i=1;i<=n;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
参考程序2(基点选择为最后一个元素)
#include <iostream>
#include <vector>
using namespace std;
// 分区函数
int partition(vector<int>& arr, int low, int high) {
int pivot = arr[high]; // 选择最后一个元素作为基准
int i = low - 1; // i 表示小于 pivot 的元素的索引
for (int j = low; j < high; j++) {
if (arr[j] <= pivot) {
i++; // 增加小于 pivot 的元素的索引
swap(arr[i], arr[j]); // 交换
}
}
swap(arr[i + 1], arr[high]); // 将 pivot 放到正确的位置
return i + 1; // 返回 pivot 的最终位置
}
// 快速排序函数
void quickSort(vector<int>& arr, int low, int high) {
if (low < high) {
int pi = partition(arr, low, high); // 分区索引
quickSort(arr, low, pi - 1); // 递归排序左子数组
quickSort(arr, pi + 1, high); // 递归排序右子数组
}
}
int main() {
vector<int> arr = {10, 7, 8, 9, 1, 5};
int n = arr.size();
cout << "原始数组: ";
for (int x : arr) cout << x << " ";
cout << endl;
quickSort(arr, 0, n - 1);
cout << "排序后的数组: ";
for (int x : arr) cout << x << " ";
cout << endl;
return 0;
}