算法思想:
快速排序使用的分治法策略。
基本思想是:选择一个基准数,将比基准数小的数放在他的左边,将比基准数大的放在右边。全部比完之后,将左右两边的序列再按此方法排序,直到序列中有一个数是结束。
快速排序流程:
- 选择第一个数(任意一个数都行)为基准数。
- 将比基准数小的放在前面,比基准数大的放在后面,然后将基准数放在中间即可。
- 利用递归的方法继续按照此方法,将左右两边的序列继续排序,直到序列中只有一个数是结束递归。
时间复杂度:
最好
最坏
平均
算法实现:
C++代码:
//查询基准数所在的位置
int FindPos(int a[],int l,int r)
{
int key=a[l];//选择第一个数为基准数
while(l<r)
{
while(l<r)//查询右边第一个小于key的值
{
if(a[r]<key) //判断当前值是否小于key
{
a[l++]=a[r];//将当前右边的值存入左边
break;
}
r--;//当前右边值大于key,则判断他的前一个
}
while(l<r)//查询左边第一个大于key的值
{
if(a[l]>key)//判断当前值是否大于key
{
a[r--]=a[l];//将当前左边的值存入右边
break;
}
l++;//当前左边值大于key,则判断他的后一个
}
}
a[l]=key;//将基准数存入当前位置
return l;
}
void QuickSort(int arr[],int l,int r)
{
if(l>=r) return;//递归结束条件
int pos=FindPos(arr,l,r);//查询当前序列基准数的位置
QuickSort(arr,l,pos-1);//对基准位置的左边进行排序
QuickSort(arr,pos+1,r);//对基准位置的右边进行排序
}