排序方式:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置
若将数据利用选择排序进行由小到大排序,有两种方式:第一种方式是每次扫描将最小值找出来放在第一位。同理也可以每次扫描将最大值找出来放在最后一个位置。
第一种方式的方法为由第一个位置的数据开始,先将第一个位置的数据看做整组数据最小的元素,依次与后面的元素进行比较,若在后面的数据中找到比第一个位置的数据小的,则更新最小值为该数据,一次扫描过后,找到待排序区间的最小值,将其与第一个位置的元素进行交换,此时第一个位置为整组数据中最小的元素,可看做已排序区间,后面的数据可看做待排序区间,再从第二个位置的数据开始,找到未排序区间的最小元素放在第二个位置,依此方法直到完成整组数据的排序。
第二种方式同理,最后一个元素开始,依次从待排序区间找到最大值从后往前放,也可以实现整组数据有小到大排序。
原始数据:6 4 9 8 3
第一次扫描后:3 4 9 8 6
第二次扫描后:3 4 9 8 6
第三次扫描后:3 4 6 8 9
第四次扫描后:3 4 6 8 9
排序完成......
时间复杂度:
无论最好情况和最坏情况,选择排序都需要找到最大值(或最小值),因此比较次数总为:n(n-1)/2,因此时间复杂度为:O(n^2)。
空间复杂度:
只需要一个额外空间,是⼀个原地排序算法,空间复杂度为: O(1)。
稳定性:
选择排序是以最大值或最小值直接与未排序的键值交换,数据排列顺序很有可能被改变,所以是:不稳定排序。
适用场景:
适用于数据量较小或已经有部分数据进行过排序的情况。
代码:
第一种写法:
import java.util.Arrays;
/**
* 选择排序
* 时间复杂度:O(n^2)
* 空间复杂度:O(1)
* 稳定性:不稳定
* */
public class SelectSort {
public static void main(String[] args){
int[] arr = {5,2,-6,8,-3,9,7,4,1,0,-5,3,6};
System.out.println("排序前:");
System.out.println(Arrays.toString(arr));
MySelectSort(arr);
System.out.println("System.out.println("MySelectSor-排序后:");");
System.out.println(Arrays.toString(arr));
}
public static void MySelectSort(int[] arr){
for(int i = 0;i<arr.length;i++){
int minIndex = i;
int tmp = 0;
for(int j = i+1;j<arr.length;j++){
if(arr[j]<arr[minIndex]){
minIndex = j;
}
}
tmp = arr[minIndex];
arr[minIndex] = arr[i];
arr[i] = tmp;
}
}
}
第二种写法:
public static void MySelectSort(int[] arr){
for(int i = arr.length-1;i>=0;i--){
int maxIndex = i;
int tmp = 0;
for(int j = i-1;j>=0;j--){
if(arr[j]>arr[maxIndex]){
maxIndex = j;
}
}
tmp = arr[maxIndex];
arr[maxIndex] = arr[i];
arr[i] = tmp;
}
}