选择排序是一种最简单的排序算法。
选择排序的简单描述
选择排序的过程简而言之,就是不断地选择剩余元素之中的最小者。
选择排序的过程简述如下:
首先,在第 1 轮循环中找到数组中最小的那个元素,将它和数组的第 1 个元素交换位置(只要找到最小的那个元素的索引,与第 1 个元素交换位置即可,如果第 1 个元素就是最小元素那么这个元素就原地不动);
然后,进入第 2 轮循环,在剩下的元素中找到最小的元素,将它与数组的第 2 个元素交换位置;
如此往复,直到将整个数组排序。
分析:每一轮交换都能排定一个元素,交换的总次数是固定的(元素的个数减一),算法的时间效率取决于比较的次数。
选择排序的特点:
选择排序有两个很鲜明的特点:
- 运行时间和输入无关:一个有序的数组或者一个主键全部相等的数组和一个元素随机排列的数组所用的排序时间竟然是一样长;
- 数据移动是最少的。
一个具体的例子
下面是一个选择排序的具体例子:
在理解了选择排序算法的前提下,可以尝试自己写出选择排序,通过 Debug 的方式来验证自己写的选择排序方法是否正确。
代码实现
Java 代码实现:
package com.sort;
import java.util.Arrays;
/**
* 选择排序
* Created by liwei on 17/5/10.
*/
public class SelectSort {
/**
* @param args
*/
public static void main(String[] args) {
int[] arr = {17, 15, 7, 9, 4};
for (int i = 0; i < arr.length - 1; i++) {
int minIndex = i; // 假设外层循环最小的那个元素的下标就是这一轮循环的第 1 个元素
for (int j = i + 1; j < arr.length; j++) {
if (arr[minIndex] > arr[j]) {
minIndex = j;
}
}
swap(arr, i, minIndex);
}
System.out.println(Arrays.toString(arr));
}
private static void swap(int[] arr, int i, int minIndex) {
// 如果最小的那个元素的索引是自己,就没有必要再使用一个额外的空间进行元素的交换
if (i == minIndex) return;
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
思考
思考:在排序算法的实现中,我们是不是可以考虑让排序算法支持泛型,即对所有类型的元素都可以参与排序。