本模块是公共类课程,适合绝大部分计算机岗位。由于 Java 受众最广且易读性强,本模块示例代码使用 Java 编写,其他语言也可参考学习。
选择排序原理
选择排序是一种简单的排序算法,主要思想是每次从未排序的元素中选择最小或最大的元素,放到已排序的末尾。
选择排序的时间复杂度是 O(n^2),空间复杂度是 O(1)。
选择排序实现
如,对数组arr = [5, 3, 8, 6, 4]
进行升序选择排序。
先让指针i
指向数组第 0 个元素,表示未排序的第 0 个元素,每经过一轮选择,i++
。
每一轮让指针minIndex
指向i
,然后依次比较,找到最小的元素的索引,最后和i
指向的元素交换位置。
排序过程如下:
第一轮
5 3 8 6 4 min j arr[min] > arr[j]
,改变指针指向5 3 8 6 4 i min j arr[min] < arr[j]
,不改变指针指向5 3 8 6 4 i min j arr[min] < arr[j]
,不改变指针指向5 3 8 6 4 i min j arr[min] < arr[j]
,不改变指针指向,此时j
位于数组末尾,开始交换位置3 5 8 6 4 第二轮
3 5 8 6 4 min j arr[min] < arr[j]
,不改变指针指向3 5 8 6 4 min j arr[min] < arr[j]
,不改变指针指向3 5 8 6 4 min j arr[min] > arr[j]
,改变指针指向,此时j
位于数组末尾,开始交换位置3 4 8 6 5 第三轮
3 4 8 6 5 min j arr[min] > arr[j]
,改变指针指向3 4 8 6 5 i min j arr[min] > arr[j]
,改变指针指向,此时j
位于数组末尾,开始交换位置3 4 5 6 8 第四轮
3 4 5 6 8 min j arr[min] < arr[j]
,不改变指针指向,此时j
位于数组末尾,开始交换位置循环结束后,
i
指向数组末尾,排序完成。
选择排序代码实现
java
public void selectionSort(int[] nums) {
int n = nums.length;
for (int i = 0; i < n - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < n; j++) {
if (nums[j] < nums[minIndex]) {
minIndex = j;
}
}
if (minIndex != i) {
int temp = nums[i];
nums[i] = nums[minIndex];
nums[minIndex] = temp;
}
}
}