快排就是利用一个标志,左边的都比标志小,右边的都比标志小
所以首先要做的就是确定标志
我们用数组的第一个数代表标志flag = a【start】,
此时start的位置就看成空位由p指向空位
然后进行分别查看,因为是分成两部分,所以一个从前往后一个从后往前比较方便
从后面往前走的指针我们定义为end,从前往后的我们定义为start
当end>start的时候,就说明两指针没有相遇就能操作
当在移动end的时候如果遇到比flag小的就说明应该放在前面空位中,a[p]=a[end] ,
p指向空位p =end;
同理在移动start的时候如果遇到的比flag大就应该放在后面的空位,a【p】=a【start】,p=start;
当两指针相遇时说明所以元素都遍历了一次就该跳出了此时end<=start;
然后递归左右,只不过左右的头尾指针就要变了。
//快排:
#include<iostream>
using namespace std;
void fast_sort( int start,int end);
int n;
int a[1000];
int main(void)
{
//输入数据:
cin>>n;
int *b;
for(int i=0;i<n;i++)
{
cin>>a[i];//输入每一个数字
}
//快排
fast_sort( 0,n-1);
//cout<<n<<endl;
for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}
void fast_sort( int start,int end)
{
//首先取开始为flag
int flag = a[start];
int s= start;
int e =end;
int p = start;//p代表空位
if(end<=start)
{
return ;
}
while(1)
{
//从end开始:
while(a[e]>flag&&s<e)
{
e--;
}
if(s<=e&&a[e]<flag)//注意while循环是由s==e跳出来的时候执行就要看情况
{
a[p] = a[e];
p=e;
e--;
}
while(a[s]<=flag&&s<e)
{
s++;
}
if(s<=e&&a[s]>flag)
{
a[p] =a[s];
p=s;
s++;
}
if(s>=e) break;
}
a[p] = flag ;
//递归做边的;
fast_sort( start , p-1);
//递归右边:
fast_sort( p+1, end) ;
}