蓝桥杯试题集试题总汇(C++)
问题描述
用递归来实现快速排序(quick sort)算法。快速排序算法的基本思路是:假设要对一个数组a进行排序,且a[0] = x。首先对数组中的元素进行调整,使x放在正确的位置上。同时,所有比x小的数都位于它的左边,所有比x大的数都位于它的右边。然后对于左、右两段区域,递归地调用快速排序算法来进行排序。
输入格式:输入只有一行,包括若干个整数(不超过10个),以0结尾。
输出格式:输出只有一行,即排序以后的结果(不包括末尾的0)。
样例输入
5 2 6 1 7 3 4 0
样例输出
1 2 3 4 5 6 7
分析
快速排序的代码可分为三类,以首项为基准,以尾项为基准,以中间项为基准。但其的思路都是一样的,都是将所有比基准小的数都位于它的左边,所有比基准大的数都位于它的右边,递归地调用快速排序算法来进行排序。
参考代码
这里举例以中间项为基准。
//以中间项为基准
#include <iostream>
#include <math.h>
using namespace std;
int a[11];
void quick_sort(int a[],int left,int right)
{
int i=left,j=right;
int basic=a[(left+right)/2];
while(i<=j)
{
//从左到右找到大于等于基准点的元素
while(a[i]<basic)
{
i++;
}
//从右到左找到小于等于基准点的元素
while(a[j]>basic)
{
j--;
}
if(i<=j)
{
swap(a[i],a[j]);
i++;
j--;
}
}
if(j>left)
quick_sort(a,left,j);//递归左
if(i<right)
quick_sort(a,i,right);//递归右
}
int main()
{
int i,j;
for(i=0;i<10;i++)
{
cin>>a[i];
if(a[i]==0)
break;
}
quick_sort(a,0,i-1);//0不排
for(j=0;j<i;j++)
cout<<a[j]<<' ';
return 0;
}