题目
以某个数为标准,把比这个数大的都移到它的后面,比这个数小的都移到它的前面,这样它后面的任意一个数都比它前面的任意一个数大,再将这前后两组数再分别重复这一过程,最后就会得到有序的数列;补充:如果从大到小排列可以将比这个数大的都移到它的前面,比这个数小的都移到它的后面.
快速排序从小到大排序算法描述:
1)设置两个变量first、last,令first等于一组数的第一个数的下标,last等于一组数的最后一个数的下标;
2)以某个数组元素作为关键数据(这里将这组数的第一个数作为关键数据),赋值给key,即key=A[first];
3)从last开始向前搜索,即由后开始向前搜索(last--),找到第一个小于key的值A[last],将A[last]给A[first];
4)从first开始向后搜索,即由前开始向后搜索(first++),找到第一个大于key的A[first],将A[first]给A[last];
5)重复第3、4步,直到first=last,将key的值给a[first];
6)将first两边的两组数分别再进行排序,重复1、2、3、4、5步;直到每组只剩一个数排序结束.
现在,我们的题目来了...
输入一组整数,将这组整数从小到大排列。
*/
#include <iostream>
using namespace std;
int a[100]={0};
void quicksort(int left,int right)
{
int t;
if(left>=right) //当left 与 right 两个数 相等时结束;
return ;
int i=left; //备份 left要在下次quicksort 做起始边界
int j=right; //备份 right要在下次quicksort 始终止边界
while (i!=j)
{
while (a[j] >=a[left]&&i<j) (1) //设置左边为参数,那么一定要从右边开始找,因为这决定了在i=j时,
//与参数交换的是比参数大的数,还是比参数小的数(此题为从小到大,保证每次停止都是
// 要停到比参数值小数上,让这个数与参数值交换,保证参数值前边的都比参数值小,
//后边的都比参数值大))
{
j--; //如果从大到小,上边改成<= 下边 改成>=
}
while (a[i] <=a[left]&&i<j)
{
i++;
}
if(i<j)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
t=a[left];
a[left]=a[j];
a[j]=t;
quicksort(left,i-1);
quicksort(i+1,right);
}
int main()
{
int n;
cin >>n;
for(int i=1;i<=n;i++)
cin >>a[i];
quicksort(1,n);
for(int i=1;i<=n;i++)
cout << a[i]<< endl;
return 0;
}