一、选择排序(Selection Sort)思想
① 从序列中找出最大的那个元素与最末尾的元素交换位置(执行完一轮后,最末尾的那个元素是最大的元素)
② 忽略 ① 中找到的最大元素,重复执行步骤 ①
找 n - 1 次最大的元素(n 是元素个数)
二、代码实现
public static void selectionSort(Integer[] ints) {
// 找最大的元素与最末尾的交换位置
for (int end = ints.length - 1; end > 0; end--) {
int maxNumIdx = 0; // 假设第一个位置的元素就是整个序列中最大的
for (int start = 1; start <= end; start++) { // 一趟选择排序(已经选出了一个最大的元素)
if (ints[start] > ints[maxNumIdx]) {
maxNumIdx = start;
}
}
// 把最大的元素和最末尾的元素交换
int temp;
temp = ints[maxNumIdx];
ints[maxNumIdx] = ints[end];
ints[end] = temp;
}
}
三、问题讨论
选择排序的交换次数要远远少于冒泡排序,平均性能优于冒泡排序。
一趟选择排序是在选择一个最大的元素(选最值)
选最值可通过【堆】进行优化