//从小到大的快速排序
#include<iostream>
using namespace std;
int a[10005],n;
void Quick_Sort(int start, int end)
{
if(start>=t) //如果相等就只有1个元素待排 返回
{ //起始元素下标 大于 末尾元素下标 越界返回
return;
}
int p=a[start],k=end,l=start,r=end;
//p变量储存区间第一个元素作为对照 k来判断每次该移左端点还是右端点
//因为开始判断的是区间第一个元素,所以从右端点开始判断,利于交换
//s和e会用于后续传参,所以用l,r分别储存
while(l!=r) // 左右端点不重合时进行排序
{ //判断是该从右边取数判断 还是从左边取数判断
if(k==r) //如果k=r从右取数
{
if(a[r]>=p) //如果右边的数已经大于等于对照数
{
r--; //则放置区间正确,向前取数继续判断
k=r;
}
else //如果右边的数比对照数小
{
a[l]=a[r]; //应该交换到对照数前的区间,存到数组下标为l的位置
l++; //l位置存放好正确的数,l向后移动一位
//这样数组的a[r]元素已经放置到正确的区间
k=l; //后续交换时a[r]位置的数就可以被替换,准备从l位置取数判断
}
}
else //否则k=l,从左取数
{
if(a[l]<=p) //如果左边的数已经小于等于对照数
{
l++; //则放置区间正确,向后取数继续判断
k=l;
}
else //如果左边的数比对照数大
{
a[r]=a[l]; //应该交换到对照数后的区间,存到数组下标为r的位置
r--; //r位置存放好正确的数,r向前移动一位
//这样数组的a[l]元素已经放置到正确的区间
k=r; //后续交换时a[l]位置的数就可以被替换,准备从r位置取数判断
}
}
} //当l=r时,r前都是小于对照数的数,r后都是大于对照数的数
a[r]=p; //a[l]或a[r]位置就可以存放对照数,对照数位置确定为a[l]或a[r]
Quick_Sort(start,r-1); //对 对照数前的区间进行相同操作,对照数前区间为[start,r-1]
Quick_Sort(r+1,end); //对 对照数后的区间进行相同操作,对照数前区间为[r+1,end]
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
Quick_Sort(1,n);//(该区间起始元素下标,末尾元素下标)
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}
快速排序 -《自学笔记》
于 2022-03-27 01:59:18 首次发布