选择排序(图解+C代码)

算法原理:

选择排序是一种简单直观的排序算法。它的工作原理为:

▶首先在序列中找到最小(大)元素,放到序列的起始位置作为已排序序列;

▶然后,再从剩余未排序元素中继续寻找最小(大)元素,放到已排序序列的末尾;

▶重复上述步骤,直到所有元素均排序完成。

一、图像模拟 选择排序 过程

我们选取十个数字0~9当做我们的排序数字,并将其打乱。然后我们将按照升序进行排列。如下图:

 排序的过程就是循环重复上述原理中的步骤,下面我们按一轮一轮循环进行图像模拟。

1、第一轮循环

①初始化选取最小值

在正式排序之前,我们先进行初始化,初始化的任务是选取一个最小值,当然,在未开始比较之前计算机也不可能知道哪个是最小值。所以我们就要先假设一个,先用这个假设的最小值去和每一个值比较,最终得到真正的最小值。

这里我们选取第一个数字5作为初始化假设的最小值。

②寻找最小值

现在我们拿着假设的最小值5去和每一个值比较。

当计算机拿着5走到0时,比较发现,0更小,此时计算机将5放回,拿上0再去和剩下的每一个值比较。

选择排序(图解+C代码)_第1张图片

 

选择排序(图解+C代码)_第2张图片

其实大家已经可以看到0就是这十个数中的最小值了,但是根据选择排序原理, 仍要求计算机和剩下的数一一比较,也就是比较到7时才可以确定这个数字就是最小值了。大家需要知道有这么一个过程,这里就不在用图像一一进行模拟了,请大家自行脑补一下画面吧。

接下来呢,我们直接进行把最小值放到已排序序列末尾的操作。当然这是第一轮循环,还没有产生已排序的序列。0就是已排序序列的开头数字了。

③位置交换

当找到了最小值后,我们就要把最小值放在序列的前面了。其实就是位置交换。这轮位置交换就是数字5和数字0的位置交换。

选择排序(图解+C代码)_第3张图片

交换后,0就是已排序序列了,后续就不再对已排序序列进行任何操作了。

选择排序(图解+C代码)_第4张图片

2、第二轮循环

①初始化选取最小值

第二轮初始化开始,我们继续选取假设的最小值,这次,我们还是选取第一个数字作为假设的最小值,需要注意的是,0 已经是已排序序列,我们要从未排序的序列中选取第一个数字,也就是(5、1、8、6、2、3、4、9、7)无序序列中的数字5。

选择排序(图解+C代码)_第5张图片

②寻找最小值

当5走到1时,比较发现1比5小成立。

选择排序(图解+C代码)_第6张图片

将5放回,拿上1。

选择排序(图解+C代码)_第7张图片

当1逐位比较到7时,这轮寻找最小值执行完毕,确定1就是最小值。 

选择排序(图解+C代码)_第8张图片

③位置交换

将1移动到已排序序列(0)的末尾。

选择排序(图解+C代码)_第9张图片

交换后,(0,1)为有序序列,(5、8、2、3、4、9、7)为无序序列 

选择排序(图解+C代码)_第10张图片

3、第三轮循环

①初始化选取最小值

选取未排序序列第一个数字5作为假设最小值。

选择排序(图解+C代码)_第11张图片

②寻找最小值

当5逐位比较到2时,小于成立,5放回。

选择排序(图解+C代码)_第12张图片

选择排序(图解+C代码)_第13张图片

 

 拿上2,逐位比较到7时,确定2就是最小值。

选择排序(图解+C代码)_第14张图片

 

③交换位置

选择排序(图解+C代码)_第15张图片

选择排序(图解+C代码)_第16张图片

4、第四轮循环

 ①初始化选取最小值

选择排序(图解+C代码)_第17张图片

②寻找最小值

8走到6时,小于成立,8放回。

选择排序(图解+C代码)_第18张图片

拿上6逐位比较,走到5时小于成立,6放回。

选择排序(图解+C代码)_第19张图片

 拿上5逐位比较,走到3时小于成立,5放回。

选择排序(图解+C代码)_第20张图片

 拿上3逐位比较,比较到7时确定3就是最小值。

选择排序(图解+C代码)_第21张图片

③交换位置

将3移动到已排序序列(0、1、2)序列的末尾。

选择排序(图解+C代码)_第22张图片

选择排序(图解+C代码)_第23张图片

经过四轮循环,我们已将最小的四个数排序完成,完成最终排序需要进行十轮这样的循环。每轮循环的目的就是寻找最小的值,然后放到已排序序列的末尾。这里就不在用图像重复。大家明白思路即可。接下来,我们进入代码设计阶段。

二、程序代码设计(C语言)

代码叙述:

1、selection_sort为选择排序函数,其参数列表中的形式参数需要接收两个值:“数组” 和 “数组长度”。

2、函数体内有一个变量min,用于记录最小值的下标。

3、有一个外部for循环,用于遍历数组的每个元素

,外部for循环嵌套了一层内部for循环,内循环用于寻找最小值,记录最小值下标。

4、退出内层for循环后有三条交换语句,用于把最小值移动到已排序序列末尾。

C语言代码:

#include

void selection_sort(int *arr,int len)
{   
	int min;                          //用于存放最小值的下标
	
	for (int i = 0; i<=len; i++)
	{   min = i;                     //初始化选取假设的最小值,选取的是未排序序列的第一个数,
                                     //这里记录的是下标
	    for (int j = i; j<=len; j++)
	    {
			if (arr[j]

运行结果:

 

你可能感兴趣的:(排序算法,排序算法,排序,c语言)