並べ替えアルゴリズム - 選択並べ替え (再帰的および非再帰的)

勉強記録は急いでいて、じっくり書く時間がありませんでした。
選択ソートは、シンプルで直感的なソート アルゴリズムです。その動作原理は次のとおりです。最初に並べ替えるデータ要素から最小 (または最大) 要素を選択し、それをシーケンスの開始位置に格納し、その後、並べ替えられていない残りの要素から最小 (最大) 要素を見つけます。そしてそれをソートされたシーケンスの最後に置きます。ソートされるすべてのデータ要素の数がゼロになるまで、同様に続きます。選択ソートは不安定なソート方法です。

非再帰的:

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++了
}

ここで少し興味があります。ここで a++ を再帰的に渡すと最初の要素のみが配置されますが、a+1 を記述するとすべての要素が配置されます。おそらくここでのポインターについて完全に理解していないのかもしれません。誰かがその理由を教えてくれることを願っています。

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

おすすめ

転載: blog.csdn.net/qq_44627822/article/details/121455755