Inserir classificação + mesclagem não recursiva e classificação 09-ordenação 2 Inserir ou mesclar (25 pontos)

09-Classificar 2 inserção ou mesclagem (25 pontos)

De acordo com a Wikipedia:

A classificação de inserção itera, consumindo um elemento de entrada a cada repetição e aumentando uma lista de saída classificada. Cada iteração e classificação de inserção remove um elemento dos dados de entrada, localiza o local a que pertence na lista classificada e o insere lá. Ele se repete até que nenhum elemento de entrada permaneça.

A classificação por mesclagem funciona da seguinte maneira: Divida a lista não classificada em N sublistas, cada uma contendo 1 elemento (uma lista de 1 elemento é considerada classificada). Em seguida, mesclar duas sublistas adjacentes repetidamente para produzir novas sublistas classificadas até restar apenas 1 sublist.

Agora, dada a sequência inicial de números inteiros, juntamente com uma sequência resultante de várias iterações de algum método de classificação, você pode dizer qual método de classificação estamos usando?

Especificação de entrada:
cada arquivo de entrada contém um caso de teste. Para cada caso, a primeira linha fornece um número inteiro positivo N (≤100). Então, na próxima linha, N inteiros são dados como a sequência inicial. A última linha contém a sequência parcialmente classificada dos N números. Supõe-se que a sequência de destino esteja sempre ascendente. Todos os números em uma linha são separados por um espaço.

Especificação de saída:
para cada caso de teste, imprima na primeira linha “Classificação por inserção” ou “Classificação por mesclagem” para indicar o método usado para obter o resultado parcial. Em seguida, execute esse método para mais uma iteração e produza na segunda linha a sequência de nova determinação. É garantido que a resposta seja exclusiva para cada caso de teste. Todos os números em uma linha devem ser separados por um espaço e não deve haver espaço extra no final da linha.

Entrada de amostra 1:

10
3 1 2 8 7 5 9 4 6 0
1 2 3 7 8 5 9 4 6 0

Saída de amostra 1:

Insertion Sort
1 2 3 5 7 8 9 4 6 0

Entrada de amostra 2:

10
3 1 2 8 7 5 9 4 0 6
1 3 2 8 5 7 4 9 0 6

Saída de amostra 2:

Merge Sort
1 2 3 8 4 5 7 9 0 6

Resolva o problema
Escreva a classificação por inserção e a mesclagem, julgue após cada classificação, se estiver na mesma ordem que a sequência numérica especificada, significa o método de classificação e a saída após a classificação em uma etapa;

1. A função de entrada
T é usada para classificação de inserção;
I é usada para classificação de mesclagem;

#include<iostream>
using namespace std;
#define MAXN 101

int N;
int T[MAXN]; 
int I[MAXN];
int Result[MAXN];
void input()
{
	cin>>N;
	for(int i=0;i<N;i++)
	cin>>T[i];
	
	for(int i=0;i<N;i++) I[i]=T[i];
	
	for(int i=0;i<N;i++)
	cin>>Result[i];
}

2. Inserir classificação
Dos subscritos 1 a N-1, compare com os números anteriores, um por um: se o número da frente for grande, o número grande se moverá para trás e, se o número da frente for pequeno, será inserido depois dele;

void InsertSort()
{
	int i;
	
	for(int i=1;i<N;i++)
	{
		int tmp=T[i];
		int j;
		for(j=i;j>0&&T[j-1]>tmp;j--)
			T[j]=T[j-1];
		T[j]=tmp;
		
		//判断是否与某一步骤吻合 
		int flag=1;
		
		for(int t=0;t<N;t++)
		{
			if(T[t]!=Result[t])
				{
					flag=0;
					break;
				 }	  
		}

		//执行输出 
		if(flag==1){
			cout<<"Insertion Sort"<<endl;
			tmp=T[i+1];
			for(j=i+1;j>0&&T[j-1]>tmp;j--)
				T[j]=T[j-1];
			T[j]=tmp;
			for(int t=0;t<N-1;t++)
			cout<<T[t]<<" ";
			cout<<T[N-1];
			return;
		}
	}
}

3. Mesclar classificação (não recursiva)
:
coloque as partes L ~ R-1 e R ~ Rightend de A em TmpA e copie-as novamente de TmpA;

void Merge( int A[], int TmpA[], int L,int R, int RightEnd)
 { //将有序的A[L]~A[R-1]和A[R]~A[RightEnd]归并成一个有序序列
 	int LeftEnd,tmp;
	int i;
	int Num;
	
	LeftEnd = R-1;
	tmp=L; //保存起始位置
	Num = RightEnd-L+1; //计算要归并的数的个数
	
	while(L <= LeftEnd && R<=RightEnd){ //两个都没有遍历完
		if(A[L]<=A[R])
			TmpA[tmp++]=A[L++];
		else
			TmpA[tmp++]=A[R++]; 
	} 
	
	while(L<=LeftEnd){   //若右边完了,左边还有,则左边添进去 
		TmpA[tmp++]=A[L++];
	}
	while(R<=RightEnd){
		TmpA[tmp++]=A[R++];
	}
	
	for( i =0;i<Num;i++,RightEnd--)
		A[RightEnd]=TmpA[RightEnd];       //把这些数全部拷贝到A中 
 }

Combine o número de cada comprimento em A em TmpA em pares. Quando houver um par na cauda, ​​faça uma mesclagem novamente.Se houver apenas uma cauda, ​​copie-o diretamente de volta para A.

void Merge_pass(int A[], int TmpA[],int N,int length)
{ //两两归并相邻有序序列
	int i,j;
	
	for(i=0;i<=N-2*length;i+=2*length)  //处理成对的部分
		Merge(A,TmpA,i,i+length,i+2*length-1);
		
	if(i+length<N)
		Merge(A,TmpA,i,i+length,N-1);
	else 
		for(j=i;j<N;j++) TmpA[j]=A[j];       //把A赋值给TmpA	 
	
}

Mesclagem completa, quando o comprimento é inicializado como 1, a mesclagem começa a partir de um único número até que todos os números sejam mesclados;
durante o período, se a função de julgamento julgar que a sequência atual é a mesma que a sequência especificada, pode ser considerada mesclada e classificada e saída.

int Judge(int F[])
{
	int flag=1;
	for(int i=0;i<N;i++)
	{
		if(I[i]!=Result[i])
		{
			flag=0;
			break;
		}
	}
	if(flag==0) return 0;
	if (flag==1) return 1;
}

void MergeSort()
{
	int * TmpA=new int [N];
	int length =1;
	

		while(length<N)
		{
			Merge_pass(I,TmpA,N,length);
			length *=2;
			if(Judge(TmpA)) {
			cout<<"Merge Sort"<<endl;
			Merge_pass(TmpA,I,N,length);
			for(int i=0;i<N-1;i++)
			cout<<I[i]<<" ";
			cout<<I[N-1];
				return;
			}
//			Merge_pass(TmpA,I,N,length);
//			length*=2;
//			if(Judge(I)){
//			cout<<"Merge Sort"<<endl;
//			Merge_pass(I,TmpA,N,length);
//			for(int i=0;i<N-1;i++)
//			cout<<TmpA[i]<<" ";
//			cout<<TmpA[N-1];
//				return;
//			}
			
		}
		delete TmpA;

}

Como A e TmpA são os mesmos sempre que a função Merge retorna, o loop precisa ser julgado apenas uma vez;

Função 4.main

int main()
{
	input();
	InsertSort();
	MergeSort();
}

Observe que o
método de classificação recursiva é difícil de obter os resultados de cada etapa, e o
método não recursivo pode obter os resultados de cada etapa.

Método mais conveniente

Primeiro, determine se é uma classificação de inserção: a
frente é classificada de pequena a grande e, se não for satisfeita, a parte traseira é igual à ordem original da matriz, é a classificação de inserção;
caso contrário, é a classificação de mesclagem; a
dificuldade é
como obter o próximo passo da classificação de mesclagem?

for ( l=2; l<=N; l*=2 )

Suponha que o número é mesclado 2, 2 e 3 para ver se ou não satisfeito; See 2 + 2-I ea segunda 3 + 2i está satisfeito;
se forem satisfeitas, i é, pelo menos, 4;
se não estiver satisfeito, a corrente i é O número de mesclados e depois mesclar todos os números 2i;

Publicado 105 artigos originais · ganhou elogios 6 · vista 4946

Acho que você gosta

Origin blog.csdn.net/BLUEsang/article/details/105555424
Recomendado
Clasificación