Algoritmo de selección (modificado según la clasificación rápida): seleccione el i-ésimo valor más pequeño

1. Seleccione los valores máximo y mínimo:
a) Seleccione el valor máximo o mínimo , puede recorrer todos los elementos del arreglo y completarlo en tiempo lineal O (n).
Código:

int findmax(int* A,int N)
{
    
    
	int max = A[0];
	int tmp;
	for(int i = 1;i<N;i++){
    
    
		tmp = A[i];
		if(tmp>max){
    
     max = tmp; }
	}
	return max;
}

b) Seleccionar los valores máximo y mínimo al mismo tiempo
Análisis: Encuentra los valores máximo y mínimo de forma independiente, la complejidad del tiempo es O(2(n-1));
por lo tanto,Compare un par de datos de entrada, cuanto más pequeño se compara con el mínimo actual, más grande se compara con el máximo actual. Entonces 4 elementos se comparan 3 veces, la complejidad del tiempo es O(3[n/2]).
Inserte la descripción de la imagen aquí
Código falso:

int findmax(int* A,int N)
{
    
    
	int max,min; 
	if(n%2 == 0) {
    
     //n为偶数
		if(A[0]>A[1]) {
    
    max =A[0]; min =A[1];}
		else {
    
     max =A[1]; min =A[0]; }
	}
	else{
    
    
		max =min =A[0];
	}
	int tmp1,tmp2; //同时比较两个数
	。。。
	return max, min;
}

2. Algoritmo de selección: Devuelve el i-ésimo elemento más pequeño en la matriz A [p ... r]
Idea: Dividir y conquistar, la modificación de la clasificación rápida, la complejidad del tiempo es O(n);
como la clasificación rápida, los datos de entrada aún se dividen de forma recursiva. Pero la ordenación rápida continúa recurriendo en ambos lados, por lo que la complejidad del tiempo es O (nlgn), pero el algoritmo de selección solo se repite en un lado y la complejidad del tiempo es O (n).
Código (asumiendo que los elementos son diferentes):

int SelectK(int *A, int l, int r, int k);//找第k小数
{
    
    
	if(l == r) return A[l];
	int pivot = Partition(A, l, r); //返回主元的下标
	if(pivot == k-1) return A[pivot]; // 主元的下标为k-1则返回(下标从0开始,所以-1)
	else if(pivot >k-1) return SelectK(A, l, pivot-1, k); // 若下标大则在左边递归
	else return SelectK(A, pivot+1, r, k-pivor-2); // 小则在右边递归
}

int Partition(int *A, int l, int r)
{
    
    
	int pivot = A[r]; //将数组最后一个值作为主元
	int i = l;
	int j = r-1;
	for(;;){
    
    
		while (A[i]<pivot){
    
    i++;}
		while (A[j]>pivot){
    
    j--;}
		if(i<j) swap(A[i],A[j]);
		else break;
	}
	swap(A[i],A[right]); //将主元放在中间位置
	return i;
}

Nota: El último valor de la matriz se utiliza como pivote, y el subíndice donde se encuentra el pivote se utiliza para indicar el número de elementos.

Supongo que te gusta

Origin blog.csdn.net/qq_33726635/article/details/105632370
Recomendado
Clasificación