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;
}