快速排序的非递归实现
2015-06-10 16:14
393 查看
快速排序的非递归实现使用了一个显示的下推栈
使用向栈中压入参数和过程调用/退出不断地从栈中弹出参数来替代递归调用。
把两个子文件的较大者压入栈中。
快速排序的非递归实现
使用向栈中压入参数和过程调用/退出不断地从栈中弹出参数来替代递归调用。
把两个子文件的较大者压入栈中。
快速排序的非递归实现
#include <stdio.h> #include <stdlib.h> #include "seqstack.h" typedef int Item; #define exch(A, B) {Item t = A; A = B; B = t;} //定义全局变量 sequence_stack s; sequence_stack *p_s = &s; int partition(Item a[], int l, int r) //快排划分,以数组最有一个元素作为划分元素 { int i=l-1, j=r; Item v = a[r]; for(;;) { while(a[++i] < v); while(a[--j] > v) { if(j==l) break; //内层循环的退出条件 } if(i>=j) break; //外层循环的退出条件 exch(a[i], a[j]); } exch(a[i], a[r]); return i; } void quicksort(Item a[], int l, int r) { int i; push(p_s, r); push(p_s, l); while(!empty(s)) //栈不为空 { l = pop(p_s); r = pop(p_s); if(r <= l) continue; i = partition(a, l, r); if(i-l > r-i) { push(p_s, i-1); push(p_s, l); push(p_s, r); push(p_s, i+1); } else { push(p_s, r); push(p_s, i+1); push(p_s, i-1); push(p_s, l); } } } int main(void) { int i, N = 50, sw = 1; int *a = (int *)malloc(N*sizeof(int)); //为数据a分配相应的存储空间 init(p_s); //顺序栈初始化 if (sw) { for(i=0; i<N; i++) { a[i] = 1000 * (1.0 * rand()/RAND_MAX); } } else { for (i = 0; i < N; i++) { scanf("%d", &a[i]); } } puts("排序前"); for(i=0; i<N; i++) { printf("%d ", a[i]); } quicksort(a, 0, N-1); puts("\n排序后"); for(i=0; i<N; i++) { printf("%d ", a[i]); } printf("\n"); system("pause"); return 0; }
相关文章推荐
- 女子透支信用卡300万买奢侈品
- 如何预置某个浏览器为系统默认的浏览器?
- 数据库学习之--RedHat EL55下Mysql源码包安装
- Linux关闭IPV6
- sgu260:Puzzle(高斯消元)
- vs创建类默认生成创建人信息
- Cocos2d-x网络篇01:网络基本概念
- 2015/6/9 站立会议(写好了昨天忘记发了今天补上)
- art.dialog
- 2-2点阵格式图像
- [LA 3887] Slim Span
- PHP安装FastDFS扩展,测试上传文件
- IOS之OC入门--类方法和对象方法
- C#解析json文件的方法
- Uva - 133 - The Dole Queue
- Struts2学习笔记(4)——struts2的Action详解
- Android--第二天(项目安装启动,电话拨号器,用户通知,短信发送器,数据存储与访问)
- FastDFS配置参数详解
- Uva - 133 - The Dole Queue
- Android Volley完全解析