交换类排序之快速排序

#include<stdio.h>
void QuickSort(int R[],int l,int r)  //快排
{
	int i=l,j=r;
	int temp;
	if(l<r)
	{
		temp=R[l];  //以temp为关键字,也就是最左边的那个数
		while(i!=j)   //直到i=j为止结束
		{
			//数组中小于temp的元素放在左边,大于temp的元素放右边

			while(j>i&&temp<R[j])  --j;//从右往左扫描找到一个小于temp的元素
			if(i<j)
			{
				R[i]=R[j];
				++i;          //i指针右移一位
			}
			while(j>i&&temp>R[i]) ++i; //从左往右扫描找到一个大于temp的元素
			if(i<j)
			{
				R[j]=R[i];
				--j;      //j指针左移一位
			}
		}
		R[i]=temp;       //将temp放在最终位置
		QuickSort(R,l,i-1);   //递归地将temp左边的元素进行排序
		QuickSort(R,i+1,r);   //递归地将temp右边的元素进行排序
	}
}
int main()
{
	int R[5]={2,8,1,6,3};
	int i;
	QuickSort(R,0,4);
	for(i=0;i<5;i++)
		printf("%d ",R[i]);
	printf("\n");
	return 0;
}

交换类排序之快速排序_第1张图片

(1)时间复杂度分析:快排最好情况下的时间复杂度是O(nlogn),待排序列越接近无序,本算法效率越高。最坏情况下的时间复杂度为O(n^2),待排序列越接近有序,算法的效率越低。平均时间复杂度为O(nlogn)。就平均时间而言,快速排序是所有排序算法中最好的。

(2)空间复杂度分析:O(logn)快排是递归进行的,需要栈的辅助,因此他需要的辅助空间比其他的几类排序算法多。

你可能感兴趣的:(交换类排序之快速排序)