定义:
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。
纯白话说:所谓选择排序,即每次循环挑出最小的数,将其与本次循环的起点位置元素进行交换,如果有N个元素,则对比N-2次,因为前面N-1个元素都排好了位置,最后一位肯定是最大的,又因为是对比,所以自然会比元素个数少一。
来看一个动态图:
图片摘自--https://www.cnblogs.com/ylsm-kb/p/9505270.html
从图上可以看出,每次循环都找出了最小值,然后跟起点位置元素进行交换。
直接看代码:
package com.bean.select_sort;
import java.util.Arrays;
public class SelectSort {
public static void SelectSorted(int[] arr) {
if (arr == null || arr.length < 2) {//数组为空或元素小于2没比较意义
return;
}
for (int i = 0; i < arr.length-1; i++) {
int minIndex = i;
for (int j = i+1; j<arr.length-1; j++) {
minIndex = arr[j] < arr[minIndex] ? j : minIndex;
}
swap(arr,i,minIndex);
}
}
private static void swap(int[] arr,int left, int right) {
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
}
public static void main(String[] args) {
int arr[] = {5,1,5,4,11,21,30};
SelectSorted(arr);
System.out.println(Arrays.toString(arr));
}
}
代码也比较简单,我用一个示意图来描述代码:
每次都会把排序最小的元素放在循环的第一个位置,循环的重点位置都是N-1,为什么不是N前面已经说过了,因为N之前的位置都排序完了,最后一位肯定是最大的元素。
所以第一层for循环是为了限定起始位置和终点位置,第二层循环是在限定范围内进行查找,找到最小元素的索引minIndex,找到之后,将其位置记录下来,并将数组中的起始位置元素和minIndex数组的元素进行交换。
时间复杂度:
很明显这又是一个等差数列,所以时间复杂度是O(n²)。