快速排序算法 C++代码

首先让我们来看看<算法导论>上面的算法逻辑

QUICKSORT(A, p, r)//快速排序算法

 if (p < r )

{

q = PARTITION(A, p, r)//分成左右两半,一半不大于A[r], 一半不小于A[r]

QUICKSORT(A, p, q-1)//递归左半

QUICKSORT(A, q+1, r) //递归右半

}

 

PARTITION(A, p, r)

x = A[r]//选择最后一个元素作为比较元素

i = p 1//这个慢速移动下标必须设定为比最小下表p1,否则两个元素的序列比如21无法交换

for j = p to r-1//遍历每个元素

{

if (A[j] <= x)//比较

{

i = i + 1//移动慢速下标

Exchange A[i] with A[j ]//交换

}

}

Exchange A[i+1] with A[r]//交换

 

return i + 1//返回分割点

 

 

一次完整的比较过程如下图:

算法导论快速排序逻辑C++实现

//Data swop function

void Swap(int &p,int &q)                           

{                                                       

     int temp = p;

       p=q;

       q=temp;

} 

 

//Partition function

int Partition(int ArrayInput[],int nLow,int nHigh)                 

{                                                  

                                                                            

    int nTemp=ArrayInput[nHigh];    

    int i = nLow, j=nLow-1;   

       for(; i<nHigh; i++)

       {

              if( ArrayInput[i]<=nTemp )

              {

                     j++;

                     if(i !=j )

                     {

                           Swap(ArrayInput[i], ArrayInput[j]);

                     }

              }

       }

       

       Swap(ArrayInput[j+1],ArrayInput[nHigh]);

 

    return (j+1);                                         

}

 

//Quick sort

void Quick_sort(int ArrayInput[],int nLow,int nHigh)             

{                                                                                                        

    if(nLow < nHigh)                                         

    {                                                 

        int nIndex=Partition(ArrayInput , nLow, nHigh);                          

        Quick_sort(ArrayInput , nLow, nIndex-1);                            

        Quick_sort(ArrayInput , nIndex+1, nHigh);                            

    }                                                 

} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值