Selection Sort - HolmesJJ/Data-Structures-and-Algorithms GitHub Wiki
入门链接
6分钟搞定选择排序法 新手向的编程学习:选择排序法 演算法 -- 六種排序法之一:選擇排序法(selection sort)
图解
详解
标准写法
步骤1: 记录最小值元素的索引和值
public static void selectSort(int[] arr) {
int minIndex; // 最小值元素索引
int minNum; // 最小值元素值
}
步骤2: 两层循环
- 外层循环:需要比较的轮数,把N个数进行N-1轮排序
- 内层循环:在当前轮中,遍历每一个元素并比较
public static void selectSort(int[] arr) {
int minIndex; // 最小值元素索引
int minNum; // 最小值元素值
for (int i = 0; i < arr.length - 1; i++) {
// 记录当前第一个元素为最小值元素
minIndex = i;
minNum = arr[i];
for (int j = 1; j < arr.length; j++) {
}
}
}
步骤3: 元素交换
public static void selectSort(int[] arr) {
int minIndex; // 最小值元素索引
int minNum; // 最小值元素值
for (int i = 0; i < arr.length - 1; i++) {
// 记录当前第一个元素为最小值元素
minIndex = i;
minNum = arr[i];
for (int j = 1; j < arr.length; j++) {
if (minNum > arr[j]) {
minNum = arr[j];
minIndex = j;
}
}
// 交换,这里的交换不需要设置temp,minNum就是一个temp
if (minIndex != i) {
arr[minIndex] = arr[i];
arr[i] = minNum;
}
}
}
步骤3: 优化
public static void selectSort(int[] arr) {
int minIndex; // 最小值元素索引
int minNum; // 最小值元素值
for (int i = 0; i < arr.length - 1; i++) {
// 记录当前第一个元素为最小值元素
minIndex = i;
minNum = arr[i];
// 每一轮都能够确认一个元素的位置
// 因此,每进行一轮,内层循环都能减少一次遍历
for (int j = i + 1; j < arr.length; j++) {
if (minNum > arr[j]) {
minNum = arr[j];
minIndex = j;
}
}
// 交换,这里的交换不需要设置temp,minNum就是一个temp
if (minIndex != i) {
arr[minIndex] = arr[i];
arr[i] = minNum;
}
}
}
要点
- 把N个数进行N-1轮排序,注意是"轮"
- 既可以升序排序,也可以降序排序,把if中的获得当前最小(大)值的条件
a[j] < minNum
改为a[j] > maxNum
即可 - 最好时间复杂度是O(n^2);平均时间复杂度是O(n^2);最坏时间复杂度是O(n^2)
- 空间复杂度O(1)