Estructura de datos MOOC de la Universidad de Zhejiang-10-Ordenar 6 Ordenar con intercambio (0, i) (25 puntos)

La solución se basa en las ideas que se enseñan en el MOOC, pero los métodos de implementación no son exactamente los mismos. Es difícil que se le ocurra esta idea si eres dueño. De hecho, es contar el número de tres tipos de anillos en una secuencia dada. Consulta el blog 10-sort 6 Sort with Swap (0, i) (25 puntos) Creo que la idea es muy clara.
Registro de error:
1.struct Elem { int Data; int IsSelected = 0; // Aquí puede inicializar directamente eh }; Al definir la estructura, puede inicializar los miembros, y descubrí que esto todavía es posible. 2. // El orden de las siguientes dos líneas de código no puede ser incorrecto temp = p [temp] .Data; p [temp] .IsSelected = 1; 3.PElem p = new Elem [N]; // No es muy bueno usar nuevo para solicitar memoria aquí Competente, similar a malloc en lenguaje C, pero más conciso y más fácil de entender. Solicité una matriz dinámica, cada elemento es una estructura Elem, la primera dirección de la matriz es p , si malloc debe escribirse como: PElem p = (PElem) malloc (N * sizeof (struct Elem)); 4. Recuerde liberar la memoria delete [] p; 5.if (EleNum> 1) SwapCnt + = EleNum + 1; // Olvidé juzgar esto si la condición 6. Experimente esto El uso de continuar, si se cumplen las condiciones, se abandona el ciclo actual y se ingresa directamente al ciclo siguiente









#include<iostream>
using namespace std;
typedef struct Elem *PElem;
struct Elem{
    
    
  	int Data;
  	int IsSelected = 0;//这里可以直接初始化诶
};
int CntEleInCircle(PElem p,int pos){
    
    
  	int ret = 1;
  	int temp = pos;
  	while(p[temp].Data != pos){
    
    
      	//下两行代码的顺序不能错
      	temp = p[temp].Data;
      	p[temp].IsSelected = 1;     	
        ret++;
    }
  	return ret;
}
int main(){
    
    
  	int N,i;
  	cin>>N;
  	PElem p = new Elem[N];//这里使用new申请内存不是很熟练
		int SwapCnt = 0,EleNum;
  	for(i=0;i<N;++i){
    
    
      	cin>>p[i].Data;
    }
  	EleNum = CntEleInCircle(p,0);
  	if(EleNum>1) SwapCnt = EleNum - 1;
  	for(i=1;i<N;++i){
    
    
      	if(p[i].IsSelected) continue;
        EleNum = CntEleInCircle(p,i);
      	if(EleNum>1) SwapCnt += EleNum+1;//忘记判断这个if条件了
    }
  	cout<<SwapCnt;
  	delete[] p;//忘记释放了
  	return 0;
  	
}

Supongo que te gusta

Origin blog.csdn.net/weixin_43919570/article/details/105909989
Recomendado
Clasificación