一、前言
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。
二、原理
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
简单来说:升序,既是从小到大,第一个元素为最小,最后一个元素为最大;在数组元素中取最小的元素,并记录最小元素在数组中的下标(索引),然后将获取到的最小元素与第一个元素的位置交换。循环遍历,每次都找到剩余数组中的最小值,依次类推,知道所有元素均排序完。降序,原理亦如此。
三、图例
动态图(借鉴):
静态图:
四、代码示例
@Test
public void selectSort(){
int[] nums = {0,5,2,1,4,8,7};
int length = nums.length;
// 升序处理,最小的在左边既是下标为0.遍历数组 length -1 ,因为最后一个元素在前面的处理过程中已经是最大了,不需要处理。
for (int i=0;i<length-1;i++){
// 数组下标
int index = i;
// 遍历当前元素后面的元素数组,既是从 i+1 开始
for (int j=i+1;j<length;j++){
// 找出最小元素的下标,nums[index]存在 数组的第一个元素
if (nums[j] < nums[index]){
index = j;
}
}
// 本身已经是最小元素,则不处理。否则交换数组元素位置
if (i != index){
// 交换位置
int tmp = nums[i];
// 前面的下标,赋予找到最小元素下标
nums[i] = nums[index];
nums[index] = tmp;
}
}
System.out.println(Arrays.toString(nums));
}
学习地址:
https://baike.baidu.com/item/%E9%80%89%E6%8B%A9%E6%8E%92%E5%BA%8F/9762418?fr=aladdin