双队列实现队列中元素排序
来源:互联网 发布:火狐javascript void 0 编辑:程序博客网 时间:2024/06/06 07:07
题目要求对一个队列中的元素进行排序,只允许使用一个临时队列,不能进行除去入队、出队、判空以外的任何操作。
实现方法为每次遍历队列,从中找出最小的元素,放入临时队列,遍历的过程是出队的过程,注意如果一个元素比当前的最小值大,则要放回队列当中,如果比当前的最小值小,则保存起来,暂时不放回队列中,发现更小的,把原来的最小值放入,更新最小值,在遍历完一次以后,将最小值存入临时队列。然后开始第二次遍历,注意每次遍历原队列中都会减少一个元素,因此共遍历队列N次,每次对队列N、N-1、N-2 ... 1这么多次出队操作来找最小值,在最后一次完成后临时队列中存放的就是排序好的结果,出队N次即可按非降序输出。
注意最坏的情况:如果最初的队列为非降序,则会造成大量的无用功,因此在原队列生成时就动态判断是否是非降序列,如果是,则直接将原队列打印。
#include<iostream>#include<stdio.h>using namespace std;#define INF 99999999#define MAXSIZE 100001typedef struct {int items[MAXSIZE];int front;int rear;}Queue;void initQueue(Queue *q){q->front = q->rear = 0;}bool isEmpty(Queue *q){return q->front == q->rear;}void AddQ(Queue *q, int item){if ((q->rear + 1)%MAXSIZE == q->front){// 为了区分空队列与满队列,必须保证rear和front不能再次碰面,因此要留出一个距离,提前判断是否添加后front=rear。printf("队列满");return;}q->rear = (q->rear + 1) % MAXSIZE;*(q->items + q->rear) = item;}int DeleteQ(Queue *q){if (q->rear == q->front){printf("队列空");return NULL;}q->front = (q->front + 1) % MAXSIZE;return *(q->items + q->front);}int main(){Queue q;Queue tempQ;initQueue(&q);initQueue(&tempQ);int N;scanf("%d", &N);int buffer;bool isRising = true;int last = 0, now = -1;for (int i = 0; i < N; i++){scanf("%d", &buffer);AddQ(&q, buffer);now = buffer;if (i > 0 && now < last){isRising = false;}last = now;}if (isRising){printf("%d", DeleteQ(&q));while (!isEmpty(&q)){printf(" %d", DeleteQ(&q));}printf("\n");return 0;}int min;for (int i = 0; i < N; i++){min = INF;for (int j = i; j < N; j++){buffer = DeleteQ(&q);if (buffer < min){if (min != INF) AddQ(&q, min);min = buffer;}else{AddQ(&q, buffer);}}AddQ(&tempQ, min);}printf("%d", DeleteQ(&tempQ));while (!isEmpty(&tempQ)){printf(" %d", DeleteQ(&tempQ));}printf("\n");return 0;}
0 0
- 双队列实现队列中元素排序
- 队列实现插入排序
- 链式队列插入元素实现
- 链式队列元素删除实现
- 求队列中元素个数
- 3-09. 队列中的元素排序【pat】
- PAT3-09. 队列中的元素排序
- 堆排序,优先队列实现
- 拓扑排序问题(队列实现)
- 使用优先队列在iOS中实现消息排序
- 环形队列实现元素逆置
- 循环队列中元素个数怎么算
- 双队列实现栈
- 双栈实现队列
- 双栈实现 队列
- php实现双队列
- jsz中实现队列操作
- 188 求这个队列中从队列投到队列尾的元素个数
- 【codeforces #295(div 1)】ABC题解
- Android volley 解析(四)之缓存篇
- Android Studio导入GitHub上的项目常见问题(以图片轮播开源项目为实例)
- OpenGL Framebuffer Object (FBO)
- Mysql物理查询技术
- 双队列实现队列中元素排序
- cout流的重载
- AFNetworking NSURLErrorDomain error -1012
- Windows Phone 8.1添加后台任务运行条件(可添加多个)
- Qt元对象系统
- strcpy函数的实现
- 精通正则表达式(1)
- IOS:最简单一个使用自定义的TableViewCell例子
- 第1章2节《MonkeyRunner源码剖析》概述:边界(原创)