1.算法原理
将整个数组分为排序区间和待排序区间两个大区间,在一开始,可以认为整个数组都在待排序区间中.
我们要做的是找到待排序区间中的最小值(最大值),将其与数组最左侧元素交换,作为排序区间的起始位置.
重复这个步骤,找到待排序区间的最小值(最大值),将其与排序区间末尾的元素交换,直至整个数组有序.
2.图像演示
(图像来自runoob)
3.代码实现
public class SevenSort {
public static void selectionSort(int[] arr){
for (int i = 0; i < arr.length; i++) {
int min = i;
for (int j = i+1; j < arr.length; j++) {
if(arr[j]<arr[min]){
min = j;
}
}
swap(arr,min,i);
}
}
private static void swap(int[] arr, int j, int i) {
int tmp = arr[j];
arr[j] = arr[i];
arr[i] = tmp;
}
}
选择排序的优化
在之前的选择排序中,我们每次选出待排序区间的最小值放在排序区间右侧,基于该思想,我们可以在一次排序在同时选择出待排序区间的最小值和最大值,将其分别放在无序区间的最前和最后.优化后的选择排序称为双端选择排序.
public class SevenSort {
public static void selectionSortOP(int[] arr){
int low = 0;
int high = arr.length-1;
while(low <= high){
int min = low;
int max = low;
for (int i = low+1; i <= high; i++) {
if(arr[i]<arr[min]){
min = i;
}
if(arr[i]>arr[max]){
max = i;
}
}
swap(arr,low,min);
//当max(待排序区间最大值的索引)恰好与min交换后,max索引改变
if(max == low){
max = min;
}
swap(arr,max,high);
low += 1;
high -= 1;
}
}
private static void swap(int[] arr, int j, int i) {
int tmp = arr[j];
arr[j] = arr[i];
arr[i] = tmp;
}
}