(1)基本思想
每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。
具体来说就是在元素集合array[i]--array[n-1]中选择最大(小)的数据元素,若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换, 在剩余的array[i]--array[n-2](array[i+1]--array[n-1])集合中,重复上述步骤,直到集合剩余1个元素。
(2)代码实现
1.方法1:
遍历数组,依次比较array[i]和array[j]的值大小
public static void selectSort(int[] array) {
for (int i = 0; i < array.length; i++) {
int minIndex = i;
int j = i+1;
for (; j < array.length; j++) {
if (array[j] < array[i]) {
minIndex = j;
}
}
swap(array,i,minIndex);
}
}
private static void swap(int[] array,int i,int j) {
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
swap为一个交换函数,当需要交换array[i]和array[j]时调用即可。
(2)方法2:
如果array[i] < array[minIndex], minIndex = i;如果array[i] > array[maxIndex] ,则maxIndex = i。
此时找到了最大值和最小值下标,交换最小值下标为left,最大值下标为right。然后 left++, right--。
如果left对应的值就是maxIndex,此时我们需要修正一下最大值和最小值的位置。
public static void selectSort2(int[] array) {
int left = 0;
int right = array.length - 1;
while (left < right) {
int minIndex = left;//假定最小值下标
int maxIndex = left;
for (int i = left+1; i <= right; i++) {
if (array[i] < array[minIndex]) {
minIndex = i;
}
if (array[i] > array[maxIndex]) {
maxIndex = i;
}
}
swap(array,minIndex,left);
if (maxIndex == left){
maxIndex = minIndex;
}
swap(array,maxIndex,right);
left++;
right--;
}
}
(3)特性总结
1.直接选择排序由于需要遍历两边数组,因此效率不高,我们实际用的也很少
扫描二维码关注公众号,回复:
16758987 查看本文章
2. 时间复杂度:O(N^2),空间复杂度:O(1)
3. 稳定性:不稳定
如果对以上内容有问题的欢迎在评论区留言哦!