什么是选择排序?
选择排序(Selection Sort)是一种简单的排序算法,它的基本思想是不断选择剩余元素中的最小(或最大)元素,将其放到已排序的序列末尾。
选择排序的工作原理
-
初始状态:假设待排序的数组为
arr
,数组的长度为n
。 -
外循环:从数组的第一个元素开始,逐步遍历到倒数第二个元素。每次迭代处理一个元素,将其位置确定为正确的位置。
-
内循环:在每次外循环中,遍历剩余未排序的部分,找到最小(或最大)的元素。
-
交换:将找到的最小(或最大)元素与当前外循环所指的位置上的元素交换,确保当前外循环所指位置上的元素是最小的(或最大的)。
-
重复:重复步骤 2 至 4,直到整个数组都被排序完成。
选择排序的具体步骤
假设我们要对一个数组进行升序排序,选择排序的具体步骤如下:
第一轮:
-
从数组的第一个元素开始,遍历整个数组,找到最小的元素。
-
将找到的最小元素与第一个元素交换。
第二轮:
-
从数组的第二个元素开始,遍历剩余的部分(即从第二个元素到最后一个元素),找到最小的元素。
-
将找到的最小元素与第二个元素交换。
重复:
-
按照同样的方式,逐步确定每个位置上的元素,直到整个数组排序完成。
案例:
假设我们有一个数组 [64, 25, 12, 22, 11]
,我们需要对其进行升序排序。选择排序的过程如下:
第一次外循环:
-
找到数组
[64, 25, 12, 22, 11]
中最小的元素11
。 -
将
11
与第一个元素64
交换,得到[11, 25, 12, 22, 64]
。
第二次外循环:
-
在
[25, 12, 22, 64]
中找到最小的元素12
。 -
将
12
与25
交换,得到[11, 12, 25, 22, 64]
。
第三次外循环:
-
在
[25, 22, 64]
中找到最小的元素22
。 -
将
22
与25
交换,得到[11, 12, 22, 25, 64]
。
第四次外循环:
-
在
[25, 64]
中,25
已经是最小的元素。 -
不需要交换,数组已经是
[11, 12, 22, 25, 64]
。
选择排序的特点
时间复杂度:
-
最坏情况下、最优情况下和平均情况下的时间复杂度都是 O(n^2)。
空间复杂度:
-
空间复杂度为 O(1),因为选择排序是原地排序算法。
稳定性:
-
选择排序是不稳定的排序算法,因为在交换过程中可能改变相同元素的相对位置。
选择排序的简单实现如下:
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]) {
//找到小于索引 j 的元素就修改最小值索引
minIndex = j;
}
}
// 交换当前元素和找到的最小元素
if (minIndex != i) {
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
}
public static void main(String[] args) {
int[] arr = {64, 25, 12, 22, 11};
selectionSort(arr);
System.out.println("排序后滴数组:");
for (int num : arr) {
System.out.print(num + " ");
}
}
}
选择排序通过逐步选择最小(或最大)元素并将其放置在正确位置的策略,提供了一个简单而直接的排序方法。虽然效率不高,但由于其实现简便。
欧了,到这里我应该解释的差不多啦,我是南极,大胆做自己,活出精彩的人生👊👊👊