1.基本原理:每次从待排序的数据元素中选出最小(最大)的一个元素,存放在已排好序列的起始位置(末尾位置),直到全部待排序的数据元素排完。
2.大概思路:
(1)第1趟排序,在待排序数据arr[0],arr[1]...arr[n-1]选出最小的数据,将其与arr[0]进行交换。
(2)第2趟排序:在待排序的arr[1],arr[2].....arr[n-1]中选出最小的元素与arr[1]进行交换。
......
(3)依次继续,则第i趟在待排序数据arr[i-1],arr[i]....arr[n-1]中选出最小的元素与其进行交换,直至全部完成。
package demo.datastructures;
public class SelectSortDemo {
public static void selectSort(int[] arr){
if(arr==null || arr.length<2) {return;}
//如数组有n个元素,则进行n-1趟选择最小值
for(int i=0;i<arr.length-1;i++)
{
//记录替换最小值位置
int min=i;
//遍历待排序数组元素(i之后的元素)
for(int j=i+1;j<arr.length;j++)
{
//如果 已排序中的最大值 大于 待排序的值,则记录当前比较的最小值,直至待排序元素全部遍历完,找到最小值
if(arr[min]>arr[j])
{
min=j;
}
}
int temp=arr[min];
arr[min]=arr[i];
arr[i]=temp;
}
//遍历输出选择排序后的结果
for(int k=0;k<arr.length;k++)
{
System.out.println(arr[k]);
}
}
public static void main(String[] args) {
int[] arr={4,2,6,8,9,1,3,5,7,0};
selectSort(arr);
}
}
3.选择排序的时间复杂度
简单选择排序的比较次数与序列的初始排序无关。假设待排序的系列有N个元素,则比较次数总是N(N-1)/2,
而移动次数与系列的初始排序有关,当排序正序时,移动次数最少,为0,
当序列反序时,移动次数最多,为3N(N-1)/2,
所以,综上,简单排序的时间复杂度为O(N*N)
平均时间复杂度 | 最好情况 | 最坏情况 | 空间复杂度 |
---|---|---|---|
O(n²) | O(n²) | O(n²) | O(1) |
选择排序的简单和直观名副其实,这也造就了它”出了名的慢性子”,无论是哪种情况,哪怕原数组已排序完成,它也将花费将近n²/2次遍历来确认一遍。
即便是这样,它的排序结果也还是不稳定的。 唯一值得高兴的是,它并不耗费额外的内存空间。