经典算法 (一)---选择排序法

一:选择排序

1. 选择排序的定义:

选择排序(Selection sort)是一种简单直观的排序算法。

它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。

以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。

简单来说:选择排序就是经过一轮一轮的查找,每一轮都从待排序的元素中选择一个最小的(或最大的)元素,存放在起始位置,直接排序完成位置。

2. 选择排序的原理:

从未排序的数组中选择出一个最大的放到数组的第一个位置,重复前面的操作,继续从未排序的数中选择最大的,放到第二个位置,直到排序完成。

算法描述:

  1. 遍历所未排序的数,找出一个一个最小的数,记录它的数组下标。
  2. 拿最小的数和未排序数组的第一个数交换位置。
  3. 重复1-2操作,直到排序完成。

认真观看动态GIF,就容易理解了:

3. 选择排序法实例:

输入一个正整数n(1 < n <= 10),再输入n个整数,用选择法将他们从小到大排序后输出。

排序又称为分类,是程序设计的常用算法,包括冒泡排序、选择排序、和插入排序等。

第 1 步:在未排序的n-1个数( a[0] ~ a[n-1] )中找到最小数,将它与 a[0]交换;

第 2 步:在剩下未排序的 n - 1 个数( a[n - 2] ~ a[n - 1] )中找到最小数,将它与a[1]交换;

... ...

第n - 1步:在剩下未排序的2个数( a[n - 2] ~ a[n - 1] )中找到最小数,将它与a[n - 2]交换;

用流程图描叙的算法:

参考代码:

#include <stdio.h>
#define MAXN 10  
//宏定义数组常量 
int main()
{
	int i, index, k, n, temp;
	int a[MAXN]; //定义符号常量MAXN 
	printf("Enter n:\n");  //提示输入 n 
	scanf("%d", &n);
	printf("Enter %d integers:\n", n);  //提示输入 n 个数 
	for (i = 0; i < n; i++)  //将输入数依次赋值给数组 a 的元素a[0] ~ a[n-1] 
	{
		scanf("%d", &a[i]);
	}

	for (k = 0; k < n - 1; k++)
	{
		index = k;      //index存放最小值所在的下标 
		for (i = k + 1; i < n; i++)    //寻找最小值所在下标 
		{
			if (a[i] < a[index])
			{
				index = i;
			}
		}
		temp = a[index];  //最小元素与下标为 k 的元素交换 
		a[index] = a[k];
		a[k] = temp;
	}
	//输出 n 个数组元素的值 
	printf("After sorted\n");
	for (i = 0; i < n; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");

	return 0;
}

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

'撒野奔跑.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值