使用一个辅助的队列和非数组变量设计一个算法以使队列中的元素有序
2015-05-16 18:58
375 查看
/*使用一个辅助的队列和非数组变量设计一个算法以使队列中的元素有序*/ #include<stdio.h> #include<stdlib.h> #include<time.h> #define OK 1 #define ERROR 0 #define MAXSIZE 20 typedef int QElemType; typedef int Status; typedef struct { QElemType data[MAXSIZE]; int front; int rear; }SqQueue; //循环队列的初始化 Status InitSqQueue(SqQueue * S) { S->front=0; S->rear=0; return OK; } //循环队列的建立 Status create(SqQueue * S,int n) { srand((unsigned)time(NULL)); for(int i=0;i<n;i++) { S->data[i]=rand()%100; S->rear++; } return OK; } //循环队列的入队 Status EnQueue(SqQueue * S,QElemType e) { S->data[S->rear]=e; S->rear=(S->rear+1)%MAXSIZE; return OK; } //循环队列的出队 Status DeQueue(SqQueue * S,QElemType * e) { *e=S->data[S->front]; S->front=(S->front+1)%MAXSIZE; return OK; } //循环队列的长度 Status Length(SqQueue * S) { return (S->rear-S->front+MAXSIZE)%MAXSIZE; } //输出 void print(SqQueue * S) { printf("输出元素:\n"); int length=(S->rear-S->front+MAXSIZE)%MAXSIZE; for(int i=S->front;i<length;i++) { printf("%d ",S->data[i]); } printf("\n"); } //找出最大元素 Status GetMax(SqQueue * S) { int length=Length(S); int temp=S->front; for(int i=S->front+1;i<length+S->front;i++)//关键句,重点是加上S->front!!!!! { if(S->data[temp]<S->data[i]) { temp=i; } } return temp; } //把最大元素和front(data[0])元素进行交换,然后出队,入队进新的队列里 Status SwapMax(SqQueue * S,SqQueue * L) { QElemType DeElem; int temp; int Index=GetMax(S); temp=S->data[Index]; S->data[Index]=S->data[S->front]; S->data[S->front]=temp; DeQueue(S,&DeElem); EnQueue(L,DeElem); return OK; } //排序 Status Sort(SqQueue * S,SqQueue * L) { QElemType DeElem; int length=Length(S); for(int i=0;i<length;i++) { SwapMax(S,L); } InitSqQueue(S); //这一步是重新初始化队列S(或者完善初始化函数) for(int j=0;j<length;j++) { DeQueue(L,&DeElem); EnQueue(S,DeElem); } return OK; } int main() { SqQueue S,L; int ElemNumber; InitSqQueue(&S); InitSqQueue(&L); printf("输入元素个数:\n"); scanf("%d",&ElemNumber); create(&S,ElemNumber); print(&S); Sort(&S,&L); print(&S); return 0; }
相关文章推荐
- 使用两个辅助的队列和非数组变量设计一个算法以使队列中的元素有序
- (2)int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A, int nSize),使A把0移至后面,非0整数移至数组前面并保持有序,返回值为原数据中第一个元素为0的下标。(尽可能不使用辅助空间且考虑效率及异常问题,注释规范且给出设计思路)
- 顺序栈S中有2n个元素,从栈顶到栈底的元素依次为a2n、a2n-1、…、a1。试设计一个算法:通过一个循环队列重新排列该栈中的元素,使得从栈顶到栈底的元素先偶数,后奇数
- 算法与数据机构学习_第一章.栈和队列_1.设计一个有返回栈中最小元素功能的栈
- 设顺序表a中的数据元素递增有序,试设计一个算法,将x插入到顺序表的适当位置,以保持该表的有序性。
- 已知线性表中元素以值递增有序排列,并以单链表作为存储结构,设计一个算法,删除表中值相同的多余元素
- 已知一个矩阵 A(m*n) 的元素每行每列都按从小到大有序, 试设计一个算法判断任一给定值 k 是否在矩阵 A(m*n) 中
- 写程序。设ha和hb分别是两个带头结点的非递减有序单链表的头指针,试设计算法,将这两个有序链表合并成一个非递增有序的单链表。要求使用原链表空间,
- 假设以不带头结点的循环链表表示队列,并且只设一个指针指向队尾结点,但不设头指针。试设计相应的入队和出队的算法
- 给定一个有序整数数组,元素各不相同且按照升序排列,编写一个算法,创建一个高度最小的二叉查找树
- 使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组
- 整数数组中,每个元素均出现两次,除了一个元素例外,如何找出这个元素?能否设计一个线性时间的算法,且不需要额外的存储空间?
- 风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i])代表该股票第i天的股价。 假设你一开始没有股票,但有至多两次买入1股而后卖出1股的机会,并且买入前一定要先保证手上没有股票。若两次交易机会都放弃,收益为0。 设计算法,计算你能获得的最大收益。 输入数值范围:2<=n<
- 对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。 给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。
- 假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并为一个按元素值递减 有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原装(即A表和
- 说你有一个数组,其中第i个元素是第i天给定股票的价格。设计一个算法来找到最大的利润,最多可以完成两个交易。
- 数据结构:有人设计以下算法用于删除整数顺序表L中所有值在[x,y]范围内的元素,该算法显然不是高效的,请设计一个同样功能的高效算法。
- 随机产生两组整数,每组整数中元素互不相同,这两组数按值递增有序。设计程序,将这两组数合并成按值递减有序的一组数,要求合并的新的一组数中,相同的元素只有一个。
- 算法面试题:使用两个堆栈实现一个队列
- 关于PriorityQueue优先级队列中元素是否有序的一个问题