두 대기 열 이 대기 열 에서 요소 정렬 을 실현 합 니 다.

제목 은 한 대기 열 에 있 는 요 소 를 정렬 해 야 합 니 다. 임시 대기 열 만 사용 할 수 있 습 니 다. 입 대 · 출 대 · 판 공 을 제외 한 어떠한 조작 도 할 수 없습니다.
실현 방법 은 매번 대기 열 을 옮 겨 다 니 며 가장 작은 요 소 를 찾 아 임시 대기 열 에 넣 는 것 입 니 다. 옮 겨 다 니 는 과정 은 팀 을 나 가 는 과정 입 니 다. 한 요소 가 현재 의 최소 치보다 크 면 대기 열 에 넣 어야 합 니 다. 현재 의 최소 치보다 작 으 면 저장 합 니 다. 잠시 대기 열 에 넣 지 않 고 더 작은 것 을 발견 하면 원래 의 최소 치 를 넣 고 최소 치 를 업데이트 합 니 다.한 번 훑 어 본 후에 최소 값 을 임시 대기 열 에 저장 합 니 다.그 다음 에 두 번 째 로 옮 겨 다 니 기 시작 합 니 다. 원래 대기 열 을 옮 겨 다 닐 때마다 하나의 요 소 를 줄 이 는 것 을 주의 하 십시오. 따라서 모두 대기 열 N 번 을 옮 겨 다 니 며 대기 열 N, N - 1, N - 2.
최 악의 경우 주의: 최초의 대기 열 이 비 내림차 순 이 라면 많은 헛수고 를 할 수 있 으 므 로 원 대기 열 이 생 성 될 때 비 내림차 순 인지 동적 으로 판단 하고, 만약 그렇다면 원 대기 열 을 직접 인쇄 합 니 다.
#include<iostream>
#include<stdio.h>
using namespace std;

#define INF   99999999

#define MAXSIZE 100001

typedef 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("
"); 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("
"); return 0; }

좋은 웹페이지 즐겨찾기