[Ejercicio auxiliar 1 para algoritmos de aprendizaje] Universidad de Pekín POJ2388: ¿Quién está en el medio?

 Primero coloque el tema del algoritmo adjunto al correo electrónico del Sr. Chi Hao, para que sea fácil de encontrar en el futuro.


Adjunto: Clasificación de algunos temas en el POJ de la Universidad de Pekín, gracias a Yang Hao por ayudar a organizar. El número es el número de pregunta correspondiente y el sistema puede recuperar la pregunta correspondiente en consecuencia.

1. Enumeración: 1753, 2965

2. Codicioso: 2109, 2586

3. Árbol de expansión mínimo: 2485, 1258

4. Clasificación: 2388

5. Búsqueda de optimización en profundidad: 1321, 2251

6. Búsqueda optimizada de amplitud: 3278, 1426

7. Técnicas de búsqueda simple y poda: 2676

8. El problema de la mochila: 1837

9. Clasificación topológica: 1094

10. Algoritmo de ruta más corta: 1062, 1125, 2240

11. Árbol de Huffman: 3253

12. Métodos de búsqueda eficientes como tabla hash y búsqueda binaria: 2151, 2503

 Universidad de Hokkaido POJ2388: Quién está en el medio

——Acabo de terminar de leer el segundo capítulo de "Programming Pearls" ayer, que mencionaba la clasificación, así que elegí esta pregunta como ejercicio.

tema

Portal

analizar: 

Usa la idea de divide y vencerás.

Pensando que la complejidad de usar la ordenación rápida sería menor, decidí usar la ordenación rápida para ordenar primero la secuencia dada y luego generar la mediana.

 código:

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;

#define swap(a,b){int t=a;a=b;b=t;} 

int a[10005];
int partition(int left,int right){
	int i=left,j=right,t=0;
	int key=a[i];//以最左边点为基准,即创造了一个空位 
	while(i<j){
		while(i<j&&a[j]>=key){
			j--;//向左寻找比key小的数,找到则跳出while循环 
		} 
		if(i<j){
			a[i]=a[j];//a[j]就是那个小于key的值,赋给a[i](左边的坑),使小于key的值放于左边;
		} 
		//接下来从左向右找大于key的值去 
	    while(i<j&&a[i]<=key){
	    	i++;//向右寻找比key大的数,找到则跳出循环 
		}
		if(i<j){
			a[j]=a[i];//把找到的大于key的值赋给a[j](即右边的坑) ,使大于key的值放于右边 
		} 
	}
	//当i==j时,跳出了while循环,此时就剩i=j的这个空位 
	a[i]=key;//最后用key填上那个坑 
	
	return i;
}
void quicksort(int left,int right){
	if(left<right){
		int i=partition(left,right);//划分
	     quicksort(left,i-1);//分别对左右两边进行递归划分
	     quicksort(i+1,right);
	}
}
int main(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	} 
	quicksort(0,n-1);
//	for(int i=0;i<n;i++){//可以打印排序后的结果
//		cout<<a[i]<<" ";
//	}
//	cout<<endl;
	cout<<a[(n)/2]<<endl;
}



percepción 

Pídale al maestro que aprenda las habilidades del algoritmo.

——Aún es mejor hacer más preguntas, según el tipo, y tendrás ideas si haces más.

—— No escriba códigos a mano, use la computadora con más frecuencia, porque muchos problemas de algoritmos aparentemente simples tienen muchas restricciones en sus condiciones límite, que son extremadamente propensas a errores.

Mi hermano me dio dos referencias de práctica:

Portal 1 

Portal 2

Supongo que te gusta

Origin blog.csdn.net/weixin_43594181/article/details/122984709
Recomendado
Clasificación