码迷,mamicode.com
首页 > 其他好文 > 详细

快速排序与递归

时间:2014-08-11 15:00:42      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:快速排序 递归 栈溢出

快速排序是一种效率比较高的算法,算法的思想是取出待排序中的一个元素,想办法将小于他的元素交换到他的左边,大于他的元素交换于他的右侧,然后对左右两侧再分别递归进行上述过程,直到左右两侧的元素只有一个。从而实现了整体的排序。c++实现的代码如下:

//快速排序(递归)
template<typename T>
void quick_sort(T *arr,int b,int e)
{
    if(b<e)
    {    
        int i=b,j=e;
        T x=arr[i];
        while(i<j)
        {    
            while(i<j && arr[j] >= x)
                --j;
            if(i<j)
            {
                arr[i] = arr[j];
                ++i;
            }
            while(i<j && arr[i] <= x)
                ++i;
            if(i<j)
            {
                arr[j] = arr[i];
                --j;
            }
        }
        arr[i] = x; 
        quick_sort(arr,b,i-1);
        quick_sort(arr,i+1,e);
    }
}

但是以递归方式实现快速排序的算法是不稳定的,如果待排序元素本身并不是非常符合算法的设计需求,比如说本身已经是逆序或者正序的,不但排序效率降低,而且导致递归深度迅速增加,甚至堆栈溢出。

虽然在算法处理上采用随机下标或其他手段进行优化,但是也只是概率上减少,而不能杜绝堆栈溢出问题。

因此可以非递归的方式实现该算法类解决堆栈溢出的问题,原理是先以循环的方式进行左侧排序,再以循环的方式进行右侧排序。c++代码如下:

template<typename T>
void quick_sort_no_recursive_left(T *arr,int b,int e)
{
    int i,j;
loop:
    if(b<e)
    {    
        i=b;
        j=e;
        T x=arr[i];
        while(i<j)
        {    
            while(i<j && arr[j] >= x)
                --j;
            if(i<j)
            {
                arr[i] = arr[j];
                ++i;
            }
            while(i<j && arr[i] <= x)
                ++i;
            if(i<j)
            {
                arr[j] = arr[i];
                --j;
            }
        }
        arr[i] = x; 
        e = i-1;
        goto loop;
    }
}

template<typename T>
void quick_sort_no_recursive_right(T *arr,int b,int e)
{
    int i,j;
loop:
    if(b<e)
    {    
        i=b;
        j=e;
        T x=arr[i];
        while(i<j)
        {    
            while(i<j && arr[j] >= x)
                --j;
            if(i<j)
            {
                arr[i] = arr[j];
                ++i;
            }
            while(i<j && arr[i] <= x)
                ++i;
            if(i<j)
            {
                arr[j] = arr[i];
                --j;
            }
        }
        arr[i] = x; 
        b = i+1;
        goto loop;
    }
}

//快速排序(非递归)
template<typename T>
void quick_sort_no_recursive(T *arr,int b,int e)
{
    quick_sort_no_recursive_left(arr,b,e);
    quick_sort_no_recursive_right(arr,b,e);
}


快速排序与递归,布布扣,bubuko.com

快速排序与递归

标签:快速排序 递归 栈溢出

原文地址:http://blog.csdn.net/truexf/article/details/38492231

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!