1、快速排序
快排是一个不稳定的排序算法,时间复杂度和algorithm.h中的sort()函数差不多。思想简单,是一个递归的过程。,一趟排序流程如下,以升序为例:
1)、选第一个元素作为基准点。
while(i !=j)
2)、从后向前遍历,找到第一个小于基准点的元素,如A[j]
3)、从前向后遍历,找到第一个大于基准点的元素,如A[i]
4)、如果(i<j)交换两个元素
5)、交换基准点与A[i]
一趟排序结束,后续将区间进行分割,递归操作即可。
void quick_sort(int a[],int left,int right)
{
//快速排序
if(left>=right)
//此处写成if(left>right),但是当剩一个元素时,不能立即return,在下一轮中才停止,如i=0,j=-1停
return;
int temp=a[left];
int i=left,j=right;
while(i<j)
//此处也可写成 while(i!=j),逻辑是一样的,都是i=j时退出循环
{
while(a[j]>temp&&i<j)
j--;
while(a[i]<=temp&&i<j)
//此处不可写成a[i]<temp,最开始i=0,是满足条件的应该后移。否则排序有错误
i++;
if(i<j)
swap(a[i],a[j]);
}
swap(a[i],a[left]);
//此处交换的是两个位置的值,不可简单的将a[i]=temp,那样的话会将原来i处的值淹没
quick_sort(a,left,i-1);
quick_sort(a,i+1,right);
}
函数测试:
int main()
{
int n;
cin>>n;
int a[100005];
for(int i=0;i<n;i++)
{
cin>>a[i];
}
sort1(a,0,n-1);
for(int i=0;i<n;i++)
{
cout<<a[i];
}
return 0;
}
测试结果: