C语言 选择排序法

从键盘上输入10个数,用选择排序法按照从小到大的顺序输出

首先,分析一下什么叫做选择排序法。假设有十个元素a[0]~a[9],第一次将a[0]和a[1]—a[9]比较,如果其中有比a[0]小的数那么就互换值,此时a[0]一定是最小的数。第二次将a[1]和a[2]—a[9]比较,如果其中有比a[1]小的数那么就互换值,此时a[1]一定是第二小的数。以此类推,到最后那就是a[8]和a[9]比较。算下来一共进行了9次比较,再按照原来的a[0]—a[9]输出。这种算法其实就叫做选择排序法。

那么我们来了看一下如何用代码来实现这个规则:

(提示:手机用户可以左划代码部分查看注释)

#include "stdio.h"	
void px(int a[]);						//对px函数进行一个声明,方便理解px就是“排序”拼音首字母
void main() {
    
    		
	int a[10];							//定义10个数组
	printf("输入需要排序的十个数:");
	for(int i=0;i<10;i++){
    
    				//利用循环给10个数组赋值,也就是分别把输入的数赋值
		scanf("%d",&a[i]);
	}
	px(a);								//调用排序函数,将数组的值传递过去
	printf("从小到大的顺序为:");		
	for(i=0;i<10;i++){
    
    					//利用循环将排序好的值输出
		printf("%3d",a[i]);	
	}
	printf("\n");
}
void px(int a[]){
    
    
	int t;						
	for(int i=0;i<9;i++){
    
    				//进行9次循环
		for(int j=i+1;j<10;j++){
    
    		//这里的内循环是由i的值改变,次数逐渐减少
			if(a[i]>a[j])				//进行一个比较
			{
    
    t=a[i];a[i]=a[j];a[j]=t;}	//互换值
		}	
	}
}

代码很长,我们分为两个部分理解main函数和px函数;

main

语句 内容
int a[10] 定义10个一维数组分别是a[0]、a[1]、a[2]、a[3]…a[9]
printf(“输入需要排序的十个数:”) 打印输出“输入需要排序的十个数:”
for(int i=0;i<10;i++) 变量初始化i为0,如果i小于10就进行花括号里的循环体,之后进行i=i+1
scanf("%d",&a[i]) 对a[0]-a[9]赋值
px(a); 将赋值后的数组a传递给px函数,进行下一步的操作
printf(“从小到大的顺序为:”) 打印输出"从小到大的顺序为:"
for(i=0;i<10;i++) 将0赋值给i,如果i小于10就进行花括号里的循环体,之后进行i=i+1
printf("%3d",a[i]) 将a[0]-a[9]以十进制并且长度为三位的形式打印输出
printf("\n") 换行

px

还是解释一下,怕初学者误会,这里的px不是一个库函数,是用户自定义的,就是我可以定义的函数,至于它叫什么,是由我决定的,也就是说,它可以叫做px,也可以叫做jj,还可以叫做pp…等等,但是要保证名称的规范性。

这个函数主要就是两个循环比较难以理解,那么你有由足够得耐心,听我慢慢道来。让我们一起来模拟一下它是如何进行循环的
第一次外循环i=0,做一个判断是否小于9,0小于9,满足条件然后往下执行碰到第二个循环j=i+1,那么此时的j=0+1,那么j=1,进行判断j是否小于9,1<9,满足条件进行循环体;循环体的内容是如果a[i]>a[j]那么就互换值,或者如果不满足条件他们两个任意一种情况之后j=j+1,返回再进行内循环,但是第二次的循环j=2,再进行判断j是否小于9,2<9,满足条件然后继续做比较就是,判断a[0]是否大于a[2],如果大于就互换值,依次类推当j=9时不满足条件了,这个内循环算是做完了一次,然后外循环的i=i+1;此时i=1,继续进行内循环的操作。

运行结果

在这里插入图片描述

总结

选择排序法和冒泡排序法不同点在于,一个是拿一个对多个比较,一个是两个相邻的比较,各有优缺点,有兴趣的可以熟练掌握,建议了解一下。

猜你喜欢

转载自blog.csdn.net/weixin_52278438/article/details/111497181