//快速排序(课本版本)
/*
步骤:
1.设置基准数(每个子序列的第 0个数)
2.up指针指向子序列的第 0个数
3.down指针遍历第 1~n-1 个数,当找到一个数比 x 小的时候(假设这个数为 a):up指针指向下一个数(假设这个数为 b),然后交换 a 和 b
4.down遍历完后,再把 【最终up指针指向的数】 与 【基准数 a[l]】 交换
5.递归基准数左边的子序列
6.递归基准数右边的子序列
*/
#include <iostream>
using namespace std;
int main()
{
void qs(int a[],int l,int r);
int n;
int a[10];
int i;
cin>>n;
for (i=0;i<n;i++)
cin>>a[i];
qs(a,0,n-1);
for (i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
void qs(int a[], int l, int r)
{
int x,up,down;
up = l;
x = a[l]; //基准数
if (l<r)
{
for (down=l+1;down<=r;down++)
{
if (a[down]<x) //找到比 基准数x 小的数。
{
up++; //up指针指向下一个数,然后再把【这个数】 与 【找到的比x小的数】 进行交换
int temp1;
temp1 = a[up];
a[up] = a[down];
a[down] = temp1;
}
}
//最后,把【up指针最后指向的数】 与 【基准数】 交换
int temp2;
temp2 = a[up];
a[up] = a[l];
a[l] = temp2;
qs(a, l, up-1); //递归基准数左边的子序列
qs(a, up+1, r); //递归基准数右边的子序列
}
}
//快速排序(网上找到的方法)
#include <iostream>
using namespace std;
int n;
int main()
{
int a[10];
int x,i;
void qs(int a[],int m,int n);
cin>>n;
for (i=0;i<n;i++)
cin>>a[i];
qs(a,0,n);
for (i=1;i<=n;i++) //注意,经过排序后,数组中的所有元素会向后移动一位,所以遍历是从 1~n
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
void qs(int a[],int l,int r)
{
int x,i,j;
i=l;
j=r;
x=a[l]; //取子序列的第一个数为基准
if (l<r)
{
while (i<j)
{
while (i<j && x<=a[j]) //从右往左找第一个小于x的数
j--;
if (i<j)
{
a[i]=a[j]; //把比x小的数放到前面
i++;
}
while (i<j && x>a[i]) //从左往右找第一个大于x的数
i++;
if (i<j)
{
a[j]=a[i]; //把比x大的数放到后面
j--;
}
}
a[i]=x;
qs(a,l,i-1);
qs(a,i+1,r);
//排序(递归)过程
for (int k=1;k<=n;k++)
cout<<a[k]<<" ";
cout<<endl;
}
}