快速排序

本文深入探讨快速排序算法的核心思想、具体实现步骤及其在不同情况下的时间与空间复杂度表现。通过代码示例直观展示快速排序的过程,并对比其与冒泡排序在效率上的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1:算法思想:

快速排序每次都可以把数组的第一个元素放在它该待的地方。也就是让它前面的元素都小于等于它,后面的都大于等于它。这样把数组分成了两部分,对这两部分做相同的处理,如此循环。

2:具体实现:

设置两个指针,分别指向数组的第一(low)和最后的位置(high),取出第一个元素作为key。

(1):此时将low视为空(取出来给了key),从右往左先对high处理:if(high>=key)high--;这样可以找到第一个小于key的元素。取出该元素放在low处。

(2):此时将high视为空(取出来给了low),从左往右对low处理:if(low<=key)low++;这样可以找到第一个大于key的元素。取出该元素放在high处。

此时low又为空了。。。。。。。重复(1)(2)直到low=high

这时low和high都为空。我们将key放在该位置。

至此,第一个元素key找到了 的位置,并且把数组分成了两部分。利用递归再对这两部分进行同样的处理,。。。。。。

代码如下:

#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;

/*void swap(int &a,int &b)
{
	int c=a;
	a=b;
	b=c;
}*/

void Qsort(int* a,int low,int high)
{
	if(low>=high)
		return;
	int first=low;
	int last=high;
	int key=a[first];
	while(first<last)
	{
		while(first<last&&a[last]>=key)
			last--;
		a[first]=a[last];
		while(first<last&&a[first]<=key)
			first++;
		a[last]=a[first];
	}
	a[first]=key;
	Qsort(a,low,first-1);
	Qsort(a,last+1,high);
}

void main(){
	int i,j,n;
	cout<<"input n:";
	cin>>n;
	int* a=new int[n];
	srand(time(NULL));
	for(i=0;i<n;i++)
	{
		a[i]=rand()%100;	
	}

	for(i=0;i<n;i++)
	{
		cout<<a[i]<<" ";
	}
	cout<<endl;

	Qsort(a,0,n-1);
	/*for(i=n-1;i>=1;i--)
	{
		for(j=0;j<i;j++)
		{
			if(a[j]>a[j+1])
				swap(a[j],a[j+1]);
		}
	}*/

	for(i=0;i<n;i++)
	{
		cout<<a[i]<<" "; 
	}
	cout<<endl;
		
	system("pause");
}
//注释掉的部分为冒泡排序,输入n=100000时,快速排序得到随记数后,不停顿就可以得到拍好的序列;冒泡排序则停顿了好久。

3:时间和空间复杂度:

在最优的情况下,快速排序需要递归log2n次,第一次,需要遍历整个数组,需要比较n次,第二次各自需要比较(n-1)/2次,如此我们可以得到,时间复杂度为O(nlog2n)。

在最差的情况下(拍好序的数组),需要递归n-1次,我们可以得到时间复杂度为O(n2)。

平均情况下为O(nlog2n)。

空间消耗主要是递归栈造成的,在最优情况下,递归log2n次,所以空间复杂度为O(log2n);

在最差的情况下,递归了n-1次,空间复杂度为O(n)

平均情况下为O(log2n).

4:稳定性:

快速排序算法是不稳定的。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值