上一期知了姐给大家分享了在编程里经典算法之一的冒泡排序,有小伙伴问还有其他的排序方法吗?当然有呀,今天小编就给大家分享另一个排序算法——选择排序。

同样的,咱们还是举个生活中的例子来理解选择排序是怎么一回事:一群小朋友身高不同,我们需要将小朋友们按照从矮到高的规则排成一排,这时候我们选择所有小朋友里面身高最低的一个小朋友,然后将这个小朋友与原本排在第一个的小朋友进行位置交换。往返几次之后,所有的小朋友就按照从矮到高排好顺序了。

所以选择排序的原理其实也很简单,我们的数据就像是小朋友们的身高一样按照从小到大排序:首先我们将第一个数字设定为最小的数,进入循环,将每一个新的数字与初始最小数进行比较。如果新数字比初始最小数数值更小,那么就将初始最小数赋值为当前进行比较的数字,然后继续进行比较。

一次循环结束后,就确定了当前数据集里最小的一个数字,此时将最小数和原本排在第一的数字进行位置交换,此时最小数就被排好顺序了。这个时候,由于当前最小数已经确定了他的顺序,所以在之后遍历时,就不需要再与排好序的数字进行大小比较了。经过所有遍历后,原本无序的数据集就变成了我们想要得到的有序数据集。

那咱们怎么判断每一个数据集需要遍历多少次呢?每遍历一次就要找到一个最小的数字进行排序,到最后一次的时候剩下的数就不需要再遍历了,所以我们可以得知:如果一个数据有n个元素,那么选择排序就需要对数据遍历n-1次。

接下来咱们假设有一串数字需要从小到大排序,给大家用数据和图片演示一次。以下图的数据为例,可以得知5个数字需要遍历4次。

第一次遍历:(1)设当前第一个数7为最小数,7与20比较,7小于20,当前最小数不变;(2)7与11比较,7小于11,最小数不变;(3)7与8比较,7小于8,最小数不变;(4)7与5比较,7大于5,当前最小数更新为5。遍历结束,最小数为5,此时将5与7交换顺序,得到结果为下图。

第一次遍历结束后,最小数已经确定了它的顺序,因此在第二次遍历时,就不需要再比较5。

第二次遍历:(1)设定当前最小数为20,20与11比较,20大于11,当前最小数更新为11;(2)11与8比较,11大于8,当前最小数更新为8;(3)8与7比较,8大于7,当前最小数更新为7。遍历结束,当前最小数为7,此时将除了5以外剩下的数中第一个数20与7交换顺序,得到结果为下图:

第三次遍历:(1)设当前最小数为11,11与8比较,11大于8,最小数更新为8;(2)8与20比较,8小于20,最小数不变。遍历结束,此时最小数为8,8与11交换顺序,得到结果如下:

经过三次遍历后,我们发现数据的顺序已经按由大到小排序了,但是计算机并不知道,所以之后的一次遍历依旧会按照刚才的排序方法进行,但是没有数字会改变位置,直到遍历结束。

小伙伴们也可以看看下面的动图,让思路更加清晰。

根据上面咱们分享的选择排序的过程,总结出了以下在使用选择排序时需要注意的地方:

1、 有n个数,就需要进行n-1次遍历。

2、 每一次遍历都是一个循环,由于每次遍历都需要将数据在内部进行比较,因此在大循环下还有一个小循环。

3、 在每一次遍历结束之后,都会找到一个当前的最小值,这个当前的最小值会和当前排在第一位的数值进行顺序交换,交换后这个固定了顺序的数就不再参与比较,所以每个小循环的次数都会比上一次小循环的次数减去当前的循环数。

相信小伙伴们已经懂得了选择排序的原理和排序逻辑,那么下面咱们还是用代码给小伙伴们分享Java代码是如何实现选择排序的。

public class SelectionSort implements IArraySort {
@Override
public int[] sort(int[] sourceArray) throws Exception {
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length)
// 总共要经过 N-1 轮比较
for (int i = 0; i < arr.length - 1; i++) {
int min = i;
// 每轮需要比较的次数 N-i
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[min]) {
// 记录目前能找到的最小值元素的下标
min = j;
}
}
// 将找到的最小值和i位置所在的值进行交换
if (i != min) {
int tmp = arr[i];
arr[i] = arr[min];
arr[min] = tmp;
}
}
return arr;
}
}

看完知了姐的分享是不是觉得选择排序也变得好理解了呢?那么今天的分享就到这里了,

java涉及小数排序_最小值