快速排序算法

来源:互联网 发布:mac系统有什么优势 编辑:程序博客网 时间:2024/06/13 23:14

快速排序是冒泡排序的一种改进形式,通过将待排序数据分解成大小两组,然后递归分解下去,直到分解为一个元素为止来完成排序。
快速排序的关键就是分组,即如何把数组分为大于中心轴点和小于中心轴点的两部分;
分组实现步骤如下:假设数组a[left,right]
1、选择中心轴点,这里选取数组的最后一个元素a[right]为中心轴点;
2、遍历数组,范围为[left,right-1],变量i,j;初始值i=left,j=left;
3、如果a[j]>a[right],就将a[j]与a[i++]交换
4、最后将a[i]与a[right]交换,就实现分组;

算法具体代码如下:

void inline swap(int &a,int &b){    if(a==b)    {        return ;    }    a=a^b ;    b=a^b ;    a=a^b ;}
#define LEN 23int Partition(int a[],int left,int right){    int pivot=right ;    int i=left ;    int j=left ;    for(j=left;j<right;j++)    {        if(a[j]<a[pivot])        {            swap(a[j],a[i++]) ;//理解这一步是关键,为什么是a[j]和a[i++]交换呢?        }    }    swap(a[i],a[pivot]) ;    for(int m=0;m<LEN;m++)    {//打印输出,便于调试        cout<<a[m]<<"," ;    }    cout<<endl;    return i ;}
void QuikSort(int n[],int left,int right){    int tmp ;    if(left<right)    {        tmp=Partition3(n,left,right) ;        QuikSort(n,left,tmp-1) ;        QuikSort(n,tmp+1,right) ;    }}int main(){    int n[]={ 12, 2, 12, 2, 9, 11, 34, 54,5,4,3,2,1,10,9,8,7,6,5,4,3,2,1 };    QuikSort(n,0,22) ;    return 0 ;}