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:稳定性:
快速排序算法是不稳定的。