Insertar ordenar + fusión no recursiva y ordenar 09-ordenar 2 Insertar o fusionar (25 puntos)

09-Sort 2 Insertar o fusionar (25 puntos)

De acuerdo con Wikipedia:

La ordenación por inserción itera, consumiendo un elemento de entrada cada repetición y haciendo crecer una lista de salida ordenada. Cada iteración, la ordenación por inserción elimina un elemento de los datos de entrada, encuentra la ubicación a la que pertenece dentro de la lista ordenada y lo inserta allí. Se repite hasta que no quedan elementos de entrada.

La ordenación por fusión funciona de la siguiente manera: divide la lista sin ordenar en N sublistas, cada una con 1 elemento (una lista de 1 elemento se considera ordenada). Luego, combine repetidamente dos sublistas adyacentes para producir nuevas sublistas ordenadas hasta que solo quede 1 sublista.

Ahora, dada la secuencia inicial de enteros, junto con una secuencia que es el resultado de varias iteraciones de algún método de clasificación, ¿puede decir qué método de clasificación estamos usando?

Especificación de entrada:
cada archivo de entrada contiene un caso de prueba. Para cada caso, la primera línea da un número entero positivo N (≤100). Luego, en la siguiente línea, se proporcionan N enteros como la secuencia inicial. La última línea contiene la secuencia parcialmente ordenada de los N números. Se supone que la secuencia objetivo siempre es ascendente. Todos los números en una línea están separados por un espacio.

Especificación de salida:
para cada caso de prueba, imprima en la primera línea “Clasificación de inserción” o “Clasificación de combinación” para indicar el método utilizado para obtener el resultado parcial. Luego ejecute este método para una iteración más y muestre en la segunda línea la secuencia resultante. Se garantiza que la respuesta es única para cada caso de prueba. Todos los números en una línea deben estar separados por un espacio, y no debe haber espacio adicional al final de la línea.

Entrada de muestra 1:

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

Salida de muestra 1:

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

Entrada de muestra 2:

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

Salida de muestra 2:

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

Resuelva el problema
Escriba la ordenación por inserción y la ordenación por fusión, juzgue después de cada ordenación, si está en el mismo orden que la secuencia numérica dada, significa el método de ordenación y la salida después de la ordenación en un solo paso;

1. La función de entrada
T se usa para la ordenación por inserción,
I se usa para la ordenación por fusión;

#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. Inserte la clasificación
De los subíndices 1 a N-1, compárelos con los números anteriores uno por uno. Si el número delantero es grande, el número grande se mueve hacia atrás, y si el número delantero es pequeño, se inserta después;

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. Combinar la combinación de clasificación (no recursiva)
:
coloque las partes L ~ R-1 y R ~ Rightend de A en TmpA, y luego cópielas de nuevo desde 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 el número de cada longitud en A en TmpA en pares. Cuando quede un par en la cola, realice una fusión nuevamente. Si solo hay una cola, cópiela directamente a 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	 
	
}

Combinación completa, cuando la longitud se inicializa a 1, la combinación comienza desde un solo número hasta que se combinen todos los números;
durante el período, si la función de juicio juzga que la secuencia actual es la misma que la secuencia dada, se puede considerar fusionada y ordenada, y emitida.

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;

}

Debido a que A y TmpA son iguales cada vez que regresa la función Merge, el ciclo solo necesita ser juzgado una vez;

Función 4.main

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

Tenga en cuenta que el
método de clasificación recursiva es difícil de obtener los resultados de cada paso, y el
método no recursivo puede obtener los resultados de cada paso.

Método más conveniente

Primero determine si es un tipo de inserción: el
frente se ordena de pequeño a grande, y si no está satisfecho, el reverso es el mismo que el orden de la matriz original, es el tipo de inserción; de lo
contrario, es el tipo de fusión; la
dificultad es
cómo obtener el siguiente paso de la clasificación de fusión.

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

Supongamos que el número se fusionó 2, 2 y 3 para ver si o no satisfecha; Ver 2 + 2i y la segunda 3 + 2i se satisface;
si se cumplen, i es al menos 4;
si no se satisface, la corriente i es El número de fusionado, luego fusionar cada número 2i;

Publicados 105 artículos originales · ganado elogios 6 · vistas 4946

Supongo que te gusta

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