每日编程7之快速排序非递归版本
2013-02-28 17:51
232 查看
递归算法转化为非递归实现的核心思想是"用栈来模式递归函数栈"。
实现主要考虑:入栈/出栈的逻辑
对于快速排序来说。。
栈元素包括,输入序列的左右下标,初始时将0,n-1
每次循环
取出栈顶元素(p,q),若q<=p即该段子序列只有0/1个元素,则此次循环结束
在该段元素序列中执行快速排序核心算法: 确定新的中间元素 i+1
将(p,i) 和 (i+1,q) 压栈
循环结束条件:栈为空
这个递归算法如此实现的基础是:任何二次递归之间没有重叠部分
相比较而言,动态规划的实现就需要一个表来存储所有的中间结果,以使重叠部分透明
实现核心代码:
int quickSort_nonRecur(float A[],int p,int q)
{
struct stack *ptr_s;
stack_declare(ptr_s);
elementType e = {p,q};
push(ptr_s,e);
while(!isStackEmpty(ptr_s))
{
pop(ptr_s,e);
if(e.left >= e.right)
continue;
float pivot = A[e.right];
int i = e.left-1;
int j;
for(j=e.left;j<e.right;j++)
if(A[j]<pivot) {SWAP(A[i+1],A[j]); i++;}
SWAP(A[i+1],A[e.right]);
push(ptr_s,element_create(e.left,i));
push(ptr_s,element_create(i+2,e.right));
}
}
实现中的一些问题:
C语言中struct不能直接赋值,也就是说struct stack s1=s2;语法错误
我错了,结构体居然可以直接赋值,做了好多无聊的事情。。。
实现主要考虑:入栈/出栈的逻辑
对于快速排序来说。。
栈元素包括,输入序列的左右下标,初始时将0,n-1
每次循环
取出栈顶元素(p,q),若q<=p即该段子序列只有0/1个元素,则此次循环结束
在该段元素序列中执行快速排序核心算法: 确定新的中间元素 i+1
将(p,i) 和 (i+1,q) 压栈
循环结束条件:栈为空
这个递归算法如此实现的基础是:任何二次递归之间没有重叠部分
相比较而言,动态规划的实现就需要一个表来存储所有的中间结果,以使重叠部分透明
实现核心代码:
int quickSort_nonRecur(float A[],int p,int q)
{
struct stack *ptr_s;
stack_declare(ptr_s);
elementType e = {p,q};
push(ptr_s,e);
while(!isStackEmpty(ptr_s))
{
pop(ptr_s,e);
if(e.left >= e.right)
continue;
float pivot = A[e.right];
int i = e.left-1;
int j;
for(j=e.left;j<e.right;j++)
if(A[j]<pivot) {SWAP(A[i+1],A[j]); i++;}
SWAP(A[i+1],A[e.right]);
push(ptr_s,element_create(e.left,i));
push(ptr_s,element_create(i+2,e.right));
}
}
实现中的一些问题:
C语言中struct不能直接赋值,也就是说struct stack s1=s2;语法错误
我错了,结构体居然可以直接赋值,做了好多无聊的事情。。。
相关文章推荐
- 每日编程3之快速排序随机化版本
- 每日编程2之快速排序
- 每日编程6之单链表反转递归版本
- 快速排序的非递归版本
- 快速排序(递归版本)
- 每日编程10之二叉树的先序遍历的非递归版本
- 每日编程9之二叉树的先序遍历递归版本
- 快速排序 归并排序的非递归版本 备忘
- 快速排序的三种实现方式以及非递归版本
- 排序算法(五)快速排序多种版本
- 交换类排序:冒泡,快速(递归与非递归)
- 快速排序随机化版本
- 快速排序的js递归实现
- C++ 快速排序 递归实现
- 快速排序的递归方式和非递归方式
- RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->Web版本模块管理界面新增模块排序功能
- 快速排序的非递归实现
- 快速排序(递归)
- 快速排序【递归版】
- 快速排序的递归实现