快速排序

619 阅读1分钟

算法思想:

快速排序使用的分治法策略。
基本思想是:选择一个基准数,将比基准数小的数放在他的左边,将比基准数大的放在右边。全部比完之后,将左右两边的序列再按此方法排序,直到序列中有一个数是结束。

快速排序流程:

  1.  选择第一个数(任意一个数都行)为基准数。
  2.  将比基准数小的放在前面,比基准数大的放在后面,然后将基准数放在中间即可。
  3.  利用递归的方法继续按照此方法,将左右两边的序列继续排序,直到序列中只有一个数是结束递归。

时间复杂度:

最好:nlog2(n): nlog2(n)
最坏n2:n^2
平均nlog2(n):nlog2(n)

算法实现:

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);//对基准位置的右边进行排序 
}