/*使用两个辅助的队列和非数组变量设计一个算法以使队列中的元素有序*/
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=1;i<length;i++)
{
if(S->data[temp]<S->data[i])
{
temp=i;
}
}
return temp;
}
//将最大元素放入队列Q,其余的放入队列L
Status GetMaxOut(SqQueue * S,SqQueue * Q,SqQueue * L)
{
QElemType DeElem;
int length=Length(S);
QElemType MaxIndex=GetMax(S);
EnQueue(Q,S->data[MaxIndex]);
for(int i=0;i<length;i++)
{
if(i==MaxIndex)
{
DeQueue(S,&DeElem);
continue;
}
DeQueue(S,&DeElem);
EnQueue(L,DeElem);
}
InitSqQueue(S);
return OK;
}
//排序
Status Sort(SqQueue * S,SqQueue * Q,SqQueue * L)
{
int length=Length(S);
for(int i=0;i<length;i++)
{
if(i%2==0)
GetMaxOut(S,Q,L);
else
GetMaxOut(L,Q,S);
}
return OK;
}
//将队列Q的元素出队,将队列Q的元素入队原先的队列S
Status PutBackS(SqQueue * Q,SqQueue * S)
{
QElemType DeElem;
int length=Length(Q);
for(int i=0;i<length;i++)
{
DeQueue(Q,&DeElem);
EnQueue(S,DeElem);
}
return OK;
}
int main()
{
SqQueue S,Q,L;
int ElemNumber;
InitSqQueue(&S);
InitSqQueue(&Q);
InitSqQueue(&L);
printf("输入元素个数:\n");
scanf("%d",&ElemNumber);
create(&S,ElemNumber);
print(&S);
Sort(&S,&Q,&L);
PutBackS(&Q,&S);
print(&S);
return 0;
}
