选择排序是对冒泡排序的一个改进,冒泡排序中有一个缺点,比如,我们比较第一个数a1与第二个数a2的时候,只要a1比a2大就会交换位置,但是我们并不能确定a2是最小的元素,假如后面还有比它更小的,该元素还会与a2再次进行交换,而且这种交换有可能发生多次才能确定a2的最终位置。选择排序可以避免这种耗费时间的交换操作,从第一个元素开始,扫描整个待排数组,找到最小的元素之后再与第一个元素交换位置,然后再从第二个元素开始,继续寻找最小的元素与第二个元素交换位置,依次类推。需要进行N*(N-1)/2次比较,但是只需要N次交换,当N很大时,交换次数的时间影响力更大,所以选择排序的时间复杂度为O(N^2)。 空间复杂度是O(1),因为我们只需要一个临时变量。
public static selectSort(int[] data) {
int minIndex = 0;
// 外层循环是为了找到第i小(大)的数。
for (int i = 0; i < data.length; i++) {
minIndex = i;
// 内层排序是为了找到(在这一次的剩下的数据中)这一轮的最小值或(最大值)
for (int j = i + 1; j < data.length; j++) {
if (data[j] < data[minIndex]) {
minIndex = j;
}
}
if (minIndex != i) {
int temp = data[minIndex];
data[minIndex] = data[i];
data[i] = temp;
}
}
}