Arithmetic: Sort Programs
来源:互联网 发布:福田网络推手 编辑:程序博客网 时间:2024/06/05 11:39
非递归的快速排序算法
//快速排序的非递归算法
#define MAX 16 //元素个数的最大值
#define NULL -1 //失败标志
typedef struct
{ int d[MAX] ; //用数组作为队列的储存空间
int front,rear ; //指示队头位置和队尾位置的变量
} SEQUEUE ; //顺序队列类型定义
SEQUEUE sq ; //定义顺序队列
int R[MAX+1]={0,9,2,13,5,10,16,17,11,4,6,8,1,7}; //用数组来储存待排序元素,R[0]为辅助单元
int ENQUEUE (int x) //顺序循环队列的入队算法
{ if ( sq.front == (sq.rear+1) % MAX ) //满队,入队失败
return NULL;
else { sq.rear = (sq.rear+1) % MAX; //调整队尾变量
sq.d[sq.rear] = x ; //数据入队
return 1 ; } //入队成功
}
int DEQUEUE ( )//循环队列的出队算法
{ if (sq.front == sq.rear) //空队,出队失败
return NULL;
else { sq.front = ( sq.front+1) % MAX ; //调整队首变量
return ( sq.d[sq.front] ) ;} //返回队首元素
}
QUICKSORT ( ) //快速排序算法
{ int i,j,l,r;
while (1) {
l=DEQUEUE ( ); //排序区间起点序号出队
r=DEQUEUE ( ); //排序区间终点序号出队
if (l==NULL) return; //没有待排序区间,算法结束。
i = l ; j = r ;R[0] = R[i] ; //左右指针和基准值初始化
while ( i < j ) { //只要存在无序区间
while ( R[j] >= R[0] && i < j ) j--; //扩充大值区间
if (i<j) R[i++] = R[j]; //将小值记录移入小值区间
while ( R[i] <= R[0] && i < j ) i++; //扩充小值区间
if (i<j) R[j--] = R[i]; //将大值记录移入大值区间
}
R[i] = R[0]; //将基准记录放入最终位置
if (l<i-1) { //如果小值区间存在
ENQUEUE (l); //小值区间起点序号入队
ENQUEUE (i-1); //小值区间终点序号入队
}
if (i+1<r) { //如果大值区间存在
ENQUEUE (i+1); //大值区间起点序号入队
ENQUEUE (r); //大值区间终点序号入队
}
}
}
main ( )
{
sq.front = sq.rear = MAX-1; //初始化空队
ENQUEUE (1); //排序区间起点序号入队
ENQUEUE (13); //排序区间终点序号入队
QUICKSORT ( ); //调用快速排序算法
while (1) ; //在这一行设置断点,中止程序运行,以便观察程序运行的结果
}
留言:稍加改造的快速排序
//为了适应课本的需要,也为了使得程序更加通用,稍微改造了一下
#define MAX 100 //元素个数的最大值
#define NULL -1 //失败标志
typedef struct{
int d[MAX] ; //用数组作为队列的储存空间
int front,rear ; //指示队头位置和队尾位置的变量
}SEQUEUE; //顺序队列类型定义
QUICKSORT (rectype R[],int n) //快速排序算法,n-1是数组的长度(其中R[0]为辅助元素)
{ int i,j,l,r;
SEQUEUE sq; //定义顺序队列
if(n<3)return;//只有一个需要排序的元素,返回
SETNULL(sq); //
ENQUEUE(sq,1); ENQUEUE(sq,n-1);
while (!EMPTY(sq)) {
l=DEQUEUE(sq); //
r=DEQUEUE(sq); //排序区间终点序号出队
i = l ; j = r ;R[0] = R[i] ; //左右指针和基准值初始化
while ( i < j ) { //只要存在无序区间
while ( R[j].key >= R[0].key && i < j ) j--; //扩充大值区间
if (i<j) R[i++] = R[j]; //将小值记录移入小值区间
while ( R[i].key <= R[0].key && i < j ) i++; //扩充小值区间
if (i<j) R[j--] = R[i]; //将大值记录移入大值区间
}
R[i] = R[0]; //将基准记录放入最终位置
if (l<i-1) { //如果小值区间存在
ENQUEUE (sq,l); //小值区间起点序号入队
ENQUEUE (sq,i-1); //小值区间终点序号入队
}
if (i+1<r) { //如果大值区间存在
ENQUEUE (sq,i+1); //大值区间起点序号入队
ENQUEUE (sq,r); //大值区间终点序号入队
}
}
}
- Arithmetic: Sort Programs
- Merge sort code using C# (Arithmetic)
- 9.1 Programs
- Useful programs
- Optimal Programs
- First programs
- Higher-Order Perl: Transforming Programs with Programs
- Primary Arithmetic
- md5 arithmetic
- Primary Arithmetic
- Arithmetic Progressions
- DDALine Arithmetic
- Arithmetic Progressions
- Arithmetic Progressions
- Arithmetic Operators
- Arithmetic Progressions
- Arithmetic coding
- ARITHMETIC PROGRESSION
- 查看MYSQL版本
- Js Eval函数资料
- 什么是中间件?
- GWT工程包结构
- 关于java Applet
- Arithmetic: Sort Programs
- ERP 的解释
- 使用SQL语句导出表结构
- 中国古典爱情故事系列
- 聊斋故事系列
- 打招呼
- 混合字符串在CANVAS中的编排显示
- 自定义JavaScript定时器类
- SAP观察之一:SAP广告投放策略