快速排序
该算法是分治算法,首先选择一个基准元素,根据基准元素将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。
用一个例子来表达算法过程:
比如一个数组A={43,65,34,23,75,80,24,37,50,53}
1.先选择A[0]=43作为基准,先从最后一个开始比较。
此时 i=0,j=9,x=43;
2.从右开始找,直到找到小于43的数,即A[7]。
3.将A[7]与A[0]交换。i++。
此时,i=1,j=7,x=43;
4. 从做开始找,直到找到大于等于43的数,即A[1]。
5. 将A[7]与A[1]交换。j–。
此时,i=1,j=6,x=43;
6. 然后再重复2过程,直到i=j退出。
7. 此时,数据分成两个子数组,左边都小于43,右边都大于43。
8. 之后递归这两个数组即可完成排序。
9. c++代码
#include <iostream>
using namespace std;
void qsort(int s[],int l,int r){
int i=l,j=r,x=s[l];
if(l<r){
while(i<j){
while(i<j&&s[j]>=x)j--;
if(i<j)s[i++]=s[j];
while(i<j&&s[i]<x)i++;
if(i<j)s[j--]=s[i];
}
s[i]=x;
qsort(s,l,i-1);
qsort(s,i+1,r);
}
}
//测试
int main(int argc, const char * argv[]) {
int array[]={43,65,34,23,75,80,24,37,50,53},k;
int len=sizeof(array)/sizeof(int);
cout<<"The orginal arrayare:"<<endl;
for(k=0;k<len;k++)
cout<<array[k]<<",";
cout<<endl;
qsort(array,0,len-1);
cout<<"The sorted arrayare:"<<endl;
for(k=0;k<len;k++)
cout<<array[k]<<",";
cout<<endl;
return 0;
}
算法总结:
时间复杂度:(最坏)O(N2)O(N2),(最好)O(nlogn)O(nlogn),(平均)O(nlogn)O(nlogn)
空间复杂度: O(nlogn)O(nlogn)
稳定性:快排会把大于等于基准的放在基准的后面,那么如果选择相等的本来在后面的数作为基准,则破坏了相对顺序,因此快排是不稳定的。