快速排序

来源:互联网 发布:淘宝质检报告是真的吗 编辑:程序博客网 时间:2024/05/01 04:47

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

基本思想:
    在当前无序区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);
}