快速排序

最近比较有空,想熟悉一下算法,有一段时间没有写程序了。

基本思想:
    在当前无序区Array
[1..H]中任取一个数据元素(这里用中间的元素)作为比较的"基准"(不妨记为X),用此基准将当前无序区划分为左右两个较小的无序区:Array[1..I-1]和Array[I+1..H],且左边的无序子区中数据元素均小于等于基准元素,右边的无序子区中数据元素均大于等于基准元素,而基准X则位于最终排序的位置上,即Array[1..I-1]≤X.Key≤Array[I+1..H](1≤I≤H),当Array[1..I-1]Array[I+1..H]均非空时,分别对它们进行上述的划分过程,直至所有无序子区中的数据元素均已排序为止。


快速排序实现代码:

template<class T>
void quickSort(T Array[], int  nSize)
{
    run(Array, 
0, nSize-1
);
}


template
<class T>
void run(T Array[], int nleft, int  nright)
{
    
int i = nleft, j =
 nright;
    
int mid = (nleft + nright)/2
;
    T x 
=
 Array[mid];
    
    
do 
{    
        
while((i < nright) && (Array[i] < x)) i++//从左到右查找第1个大于等于x的下标

        
        
while((j > nleft ) && (Array[j] > x)) j--//从右到左查找第1个小于等于x的下标

        
        
if(i <=
 j)
        
{
            swap(Array[i], Array[j]);
            i
++
;
            j
--
;
        }

    }
 while(i <= j);
    
    
if(j > nleft)                    //sort Array[nleft...j];

        run(Array, nleft, j);
    
if(i < nright)                   //sort Array[i...nright];

        run(Array, i, nright);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值