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;