Algoritmos de clasificación: clasificación de selección (recursiva y no recursiva)

Los registros de estudio a toda prisa, no tenía tiempo para escribir con cuidado.
La clasificación por selección es un algoritmo de clasificación simple e intuitivo. Su principio de funcionamiento es: seleccione el elemento más pequeño (o más grande) de los elementos de datos que se ordenarán por primera vez, guárdelo en la posición inicial de la secuencia y luego busque el elemento más pequeño (más grande) de los elementos restantes sin ordenar. y colóquelo al final de la secuencia ordenada. Y así sucesivamente, hasta que el número de todos los elementos de datos a ordenar sea cero. La ordenación por selección es un método de ordenación inestable.

no recursivo:

void selectsort1(int *a,int n)
{
    
    
	int i,j,min_pos;
	for(i=0;i<n-1;i++)
	{
    
    	min_pos=i;
		for(j=i;j<n;j++)
		{
    
    
			if(a[min_pos]>a[j])
			{
    
    min_pos=j;}//找最小值的位置
		}
		if(i!=min_pos)
		{
    
    swap(&a[i],&a[min_pos]);}
	}
}

recursión:

void selectsort2(int *a,int n)//递归
{
    
    
	int i;
	int min_pos=0;
	if(n<2)return;
	for(i=1;i<n;i++)
	{
    
    	
		if(a[min_pos]>a[i]){
    
    min_pos=i;}
	}
	if(min_pos!=0)swap(&a[0],&a[min_pos]);
	selectsort2(a+1,--n);//这里一定要写成a+1不要写成a++了
}

Tengo un poco de curiosidad aquí, pasar recursivamente a++ aquí solo organiza el primer elemento, pero escribir a+1 los organizará a todos, tal vez no tengo una comprensión completa de los punteros aquí. Espero que alguien pueda decirme por qué.

#include<stdio.h>

void swap(int *a,int *b)
{
    
    
	int temp;
	temp=*a;
	*a=*b;
	*b=temp;
}
void selectsort1(int *a,int n)
{
    
    
	int i,j,min_pos;
	for(i=0;i<n-1;i++)
	{
    
    	min_pos=i;
		for(j=i;j<n;j++)
		{
    
    
			if(a[min_pos]>a[j])
			{
    
    min_pos=j;}//找最小值的位置
		}
		if(i!=min_pos)
		{
    
    swap(&a[i],&a[min_pos]);}
	}
}
void selectsort2(int *a,int n)//递归
{
    
    
	int i;
	int min_pos=0;
	if(n<2)return;
	for(i=1;i<n;i++)
	{
    
    	
		if(a[min_pos]>a[i]){
    
    min_pos=i;}
	}
	if(min_pos!=0)swap(&a[0],&a[min_pos]);
	selectsort2(a+1,--n);//这里一定要写成a+1不要写成a++了
}
/*
优化
selectsort3(int *a,int n)
每次比较,选择最小值放左边,最大值放右边
缩小了循环次数
*/
int main()
{
    
    
	int a[]={
    
    3,5,1,-7,4,9,-6,8,10,4};
	int n=(int)sizeof(a)/sizeof(int);
	int i;
	//selectsort1(a,n);//非递归
	selectsort2(a,n);//递归
	for(i=0;i<n;i++)printf("%3d",a[i]);
	printf("\n");
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_44627822/article/details/121455755
Recomendado
Clasificación