选择排序
概念核心思想
第一次遍历出最小值的索引,跟第一个数值交换下,第二次遍历剩下的数中最小值的索引,跟第二个数值交换下,以此类推,到最后一个。
特定
- 稳定性:不稳定
举个例子,数组7 8 7 2 3,我们知道第一遍选择第1个元素7会和2交换,那么原数组中2个7的相对前后顺序就被破坏了,所以选择排序不是一个稳定的排序算法。 - 复杂性:简单
- 空间复杂度:O(1)
- 时间复杂度:O(n^2)
第一次需要检查n个元素,但随后检查的元素数依次为n - 1, n – 2, …, 2和1。平均每次检查的元素数为1/2 * n, 因此运行时间为 n * 1/2 * n,简单地写作 O(n^2)。
代码实现
/**选择排序*/
public int[] selectSort(int[] array){
for(int i = 0 ; i < array.length - 1;i++){
int minNum = i;//设置最小值的索引为第一个
for(int j = i + 1; j <array.length; j++){
if(array[j] < array[minNum]){
minNum = j;//找到最小的值的索引
}
}
if (i != minNum) {
//让两个值交换,这里使用运算符^异或
array[i] = array[i] ^ array[minNum];
array[minNum] = array[i] ^ array[minNum];
array[i] = array[i] ^ array[minNum];
}
// 执行完一次循环,当前索引 i 处的值为最小值,直到循环结束即可完成排序
}
return array;
}
注意点
- 记录一个最小索引来实现交换
- 注意双层for循环中的两个索引位置