C语言排序之选择排序

一、什么是选择排序?

从头到尾扫描序列,找出最小的元素,和第一个元素交换,接着从剩下的元素中继续该选择和交换的方式,最终得到一个有序序列。

二、选择排序的经典例子

先来用个经典例子来庖丁解牛吧!

①经典例子:输入10个数字(乱序),利用简单选择排序法对这10个数字排序,结果从小到大排列。

②解决思路:本人使用的是两层循环来解决问题;

为能清晰地敲代码,先用笔和方格纸来模拟一下程序的大致执行过程,各位小伙伴们也可以跟着我的思路一起来写写画画:输入10个数:

1,16,5,98,23,119,18,75,65,81

 正如前面所说,找出最小的元素,先确定最小数放置在每行第一个格子(也就是说第一个格子是专门放置最小数的),如下图所示,在第一趟中1与后面的数逐一比较,共比较了9次。

C语言排序之选择排序_第1张图片

进行了这么一轮比较后,可以得到如下图所示的结果

C语言排序之选择排序_第2张图片

而1就不需要再拿出来比较,用第二个格子来放置第二趟的最小数,而第二个格子所放置的数继续与后面的数逐一比较,共比较了8次,如果遇到比第二个格子里的数还小的数,就进行交换;从而得到如下图所示的结果:

C语言排序之选择排序_第3张图片

以此类推,在第9躺进行最后一次比较,程序即可结束。

③总结规律:第一趟循环中,需要进行9次比较,需要拿第1个格子(即a[0])放置最小数;第二躺循环中,需要进行8次比较,需要拿第二个格子(即a[1])放置最小数……

第i躺循环,需要进行j-(i+1)次比较,需要拿a[j](第j个格子)放置最小数。

三、代码

#include 

int main()
{
	int i, j, temp, min, a[10];
	printf("Please input 10 number:>");//将10个乱序的数分别输入到数组a[i]
	for(i = 0;i < 10;i ++){
		scanf("%d", &a[i]);
	}

	printf("The orginal number:");	
	for(i = 0;i < 10;i ++){
		printf("%d ", a[i]);//输出原始的十个数
	}
	printf("\n");

	for(i = 0;i < 10;i++)//进行9趟循环
	{
		min = i;//选中要放置最小数的格子,即每趟的第一个格子
		for(j = i + 1;j <= 9;j ++)
			//每趟要进行9-(i+1)次第一个格子里的数与格子后面的数比较
		{
			if(a[min] > a[j]){
			temp = a[min];
			a[min] = a[j];
			a[j] = temp;
			}
		}  
	}
	printf("The sort number:");	
	for(i = 0;i < 10;i ++){
		printf("%d ", a[i]);//输出排序好的十个数
	}
	printf("\n");


	return 0;
}

你可能感兴趣的:(数据结构,c语言)