选择排序(Java实现)

176 阅读2分钟

选择排序的定义

首先,找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)。再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。

假设当前数组如下:

image.png

基于上面的逻辑我们先找到数组中的最小值并将它和数组的第一个元素交换位置

// min 记录最小值的索引, tmp用于交换
int min = 0, tmp;
// 这里从1开始遍历,不用和自己比较
for (int i = 1; i < nums.length; i++) {
    if (nums[min] > nums[i]) {
        min = i;
    }
}

int tmp = nums[0];
nums[0] = nums[min];
nums[min] = tmp;

// min = 3

经过上面代码数组中的最小值成功被放到数组最前面,并且第一个元素的位置不需要再次移动(用红色标记)

image.png

接下来我们在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置

image.png

// 假设当前剩下元素中最小值的索引是1
int min = 1;
// 这次从第三个元素开始遍历
for (int i = 2; i < nums.length; i++) {
    if (nums[min] > nums[i]) {
        min = i;
    }
}

int tmp = nums[1];
nums[1] = nums[min];
nums[min] = tmp;

// min = 1

经过这次交换数组如下,这次交换nums[min] 即(nums[1])和自身进行了交换

image.png

我们要将数组排序只需要重复上面步骤nums.length - 1 次交换就能将数组的每一项放到对应的位置,因此在最外面套一层循环

for (int k = 0; k < nums.length - 1; k++) {
    // 每次循环假设最小值是剩下元素中的第一项
    int min = k;
    // 找最小值的时候从假设的最小值的后一项开始比较,不比较自身
    for (int i = k + 1; i < nums.length; i++) {
        if (nums[min] > nums[i]) {
            min = i;
        }
    }
    
    int tmp = nums[k];
    nums[k] = nums[min];
    nums[min] = tmp;
}

到此我们就完成了选择排序