原理:
首先,找到数组中最小的元素,将他与数组中第一个元素交换。然后在剩下的元素中找到最小的元素,将他与数组的第二个元素交换。依次重复此操作,知道将整个数组排序。
总的来说,选择排序是一种很容易理解和实现的简单算法
代码:
/*
首先在未排序的数组中寻找最小元素,找到后与第一位进行交换,
然后再剩下的序列中继续寻找最小的元素,找到后与第二位进行交换。
时间复杂度 O(n^2)
*/
public class SelectionSort {
public static void selectionSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
for (int i = 0; i < arr.length - 1; i++) {
int minIndex = i; //最小元素的索引
for (int j = i + 1; j < arr.length; j++) {
minIndex = arr[j] < arr[minIndex] ? j : minIndex;
}
swap(arr,i,minIndex);
}
}
//创建一个交换的方法
public static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
public static void main(String[] args) {
int[] arr = {6,4,1,5,2,3}
selectionSort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
实现过程
红色:每次找到的最小值
绿色:已经排号的元素
i | minIndex | 0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|---|---|
6 | 4 | 1 | 5 | 2 | 3 | ||
0 | 2 | 6 | 4 | 1 | 5 | 2 | 3 |
1 | 4 | 1 | 4 | 6 | 5 | 2 | 3 |
2 | 5 | 1 | 2 | 6 | 5 | 4 | 3 |
3 | 4 | 1 | 2 | 3 | 5 | 4 | 6 |
4 | 4 | 1 | 2 | 3 | 4 | 5 | 6 |
5 | 5 | 1 | 2 | 3 | 4 | 5 | 6 |
1 | 2 | 3 | 4 | 5 | 6 |