标签:快速排序 递归 栈溢出
快速排序是一种效率比较高的算法,算法的思想是取出待排序中的一个元素,想办法将小于他的元素交换到他的左边,大于他的元素交换于他的右侧,然后对左右两侧再分别递归进行上述过程,直到左右两侧的元素只有一个。从而实现了整体的排序。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);
}标签:快速排序 递归 栈溢出
原文地址:http://blog.csdn.net/truexf/article/details/38492231