一、基本原理
前面我们介绍了冒泡排序,不断的两两比较,然后交换。二选择排序也是一个非常简单的排序算法,它的基本原理和冒泡排序相似,就是确立一个中间值然后其他的数不断的和这个中间值进行比较,直到比较结束(找出极值(最大或者最小值))注意比较但是不立即交换位置而是等到本轮比较完毕后才会准备交换,这样就能确定该元素的最终位置而不是像冒泡排序一样每一轮进行若干次交换
二、图像化解释
首先准备好一个数组
初始的默认的中间商我们就可以选择第零个元素8记录他的索引值0
然后这个中间商会和数组中一个一个的元素往后面进行比较,我们实现升序排列。比如和原数组中索引为1的7进行比较,8>7,所以不会发生中间商索引值的改变,仍旧是0,然后不断的向后比较,直到9
当比较到9这个元素时,我们作为中间商的元素8比9要小,所以此时的中间商的索引值更改为8(总共9个元素嘛),意味着9所在的位置就是目前最大元素的所在位置索引值改为8
然后从这里继续向后进行比较,由于后面没有元素了,所以本次的排序就结束了,就已经能够确定了本轮最大元素的位置,然后就将它确定。所以这里的结束条件是循环到数组的末尾,下一轮就是重新将中间商的索引值置为0然后重复第一轮的操作,后面的步骤相同,后面不再赘述。
主要原理就是:每一轮找到一个中间值的位置,然后将其放进去
三、代码实现
①先申明一个中间商
int index = 0;
②依次比较,这个for循环就是获取到每个元素准备进行比较
for (int n = 1; n < arr.Length; n++)
{
}
③ 在上面的for循环中实现
for (int n = 1; n < arr.Length; n++)
{
找出极值
if (arr[n] < arr[index])
{
index = n;
}
}
④上述已经实现了找到一轮中的最大元素的索引,找到后就可以进行交换位置,每一轮交换一个,而且交换完成后说明已经有一个元素确定好了位置,于是就可以减少比较的总次数,也就是数组长度-轮数
for (int m = 0; m < arr.Length; m++)
{
//第一步 声明一个中间商 来记录索引
//每一轮开始 默认第一个都是极值
int index = 0;
//第二步 依次比较
//-m 是因为每次比较都会将最大的数放到最后面 是为了排除上轮已经放好位置的数
for (int n = 1; n < arr.Length-m; n++)
{
//第三步 找出极值 最大值
if (arr[index] < arr[n])
{
index = n;
}
}
//第四步 放入目标位置
//如果当前极值所在位置就是目标位置 那就没必要交换了
if (index != arr.Length - 1 - m)
{
int temp = arr[index];
arr[index] = arr[arr.Length - 1 - m];
arr[arr.Length - 1 - m] = temp;
}
}
到这里你就已经实现了一个选择排序了,芜湖!
四、总结
//总结
//基本概念
//新建了一个中间商
//依次比较
//找出极值
//放入目标位置
//比较n轮
//套路写法
//两层循环
//外层轮数
//内层寻找
//初始索引
//记录极值
//内层循环外交换