基本描述
选择排序是一种简单的排序算法,它的基本思想是每次从未排序的部分选择最小(或最大)的元素,并将其放置在已排序部分的末尾。通过不断选择最小(或最大)的元素,最终得到一个有序的序列。
时间复杂度
-
首先,将数组的第一个元素视为已排序序列。
-
然后,从未排序的部分中选择最小(或最大)的元素,并将其与已排序部分的末尾元素交换位置。
-
接着,将已排序部分的末尾下标加一,表示已排序部分的长度增加。
-
重复步骤 2 和 3,直到未排序部分为空。
图例说明
假设我们有一个未排序的数组 [5, 2, 8, 12, 1]。
-
第一次迭代,找到最小的元素 1,并将其与第一个元素交换位置。此时,最小的元素已经放置在了已排序部分的末尾。
步骤1后的数组: [1, 2, 8, 12, 5]
-
第二次迭代,从剩余的未排序部分中找到最小的元素 2,并将其与第二个元素交换位置。此时,前两个元素已经放置在了已排序部分的末尾。
步骤2后的数组: [1, 2, 8, 12, 5]
-
第三次迭代,从剩余的未排序部分中找到最小的元素 5,并将其与第三个元素交换位置。此时,前三个元素已经放置在了已排序部分的末尾。
步骤3后的数组: [1, 2, 5, 12, 8]
-
第四次迭代,从剩余的未排序部分中找到最小的元素 8,并将其与第四个元素交换位置。此时,前四个元素已经放置在了已排序部分的末尾。
步骤4后的数组: [1, 2, 5, 8, 12]
-
最后一次迭代,从剩余的未排序部分中找到最小的元素 12,并将其与第五个元素交换位置。此时,所有元素都已经放置在了正确的位置。
步骤5后的数组: [1, 2, 5, 8, 12]
通过以上的迭代过程,我们最终得到了一个有序的数组 [1, 2, 5, 8, 12]。
代码实现
public class SelectionSort {
public static void selectionSort(int[] arr) {
int n = arr.length;
for (int i = 0; i < n - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
// 交换找到的最小元素和当前位置元素
int temp = arr[minIndex];
arr[minIndex] = arr[i];
arr[i] = temp;
}
}
public static void main(String[] args) {
int[] arr = {5, 2, 8, 12, 1, 6, 3, 9};
selectionSort(arr);
System.out.println("排序后的数组:");
for (int num : arr) {
System.out.print(num + " ");
}
}
}
这段代码定义了一个 selectionSort 方法,接受一个整数数组作为参数。然后,使用两个嵌套的循环进行排序。外层循环遍历数组,每次选择未排序部分的第一个元素,内层循环在未排序部分中找到最小的元素,并将其与当前位置的元素交换。
在 main 方法中,我们创建了一个测试数组,并调用 selectionSort 方法对其进行排序。最后,打印排序后的数组。