一:选择排序
1. 选择排序的定义:
选择排序(Selection sort)是一种简单直观的排序算法。
它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。
以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。
简单来说:选择排序就是经过一轮一轮的查找,每一轮都从待排序的元素中选择一个最小的(或最大的)元素,存放在起始位置,直接排序完成位置。
2. 选择排序的原理:
从未排序的数组中选择出一个最大的放到数组的第一个位置,重复前面的操作,继续从未排序的数中选择最大的,放到第二个位置,直到排序完成。
算法描述:
- 遍历所未排序的数,找出一个一个最小的数,记录它的数组下标。
- 拿最小的数和未排序数组的第一个数交换位置。
- 重复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;
}