版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27124771/article/details/83856777
一、思想
首先,找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么就和自己交换)。在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。这种方法叫做选择排序,因为它在不断地选择剩余元素之中的最小者。
二、图解过程
三、核心代码
//选择排序算法
public static void selectionSort(int[] arr) {
//不满足交换条件
if (arr == null || arr.length < 2) {
return;
}
for (int i = 0; i < arr.length - 1; i++) {
//寻找当前循环最小元素的下标
int minIndex = i;
for (int j = i + 1; j < arr.length; j++) {
minIndex = arr[j] < arr[minIndex] ? j : minIndex;
}
swap(arr, i, minIndex);
}
}
//交换数组中的两个元素
public static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
四、复杂度分析
1、时间复杂度:O(N^2)
若待排序的元素总数为N,第一次内循环比较N-1次(与除了本身的所有元素进行比较,找出最值),第二次内循环比较N-2次,以此类推,最后一次内循环比较1次。总共比较(N-1) + (N-1) + ... + 1
次,等差求和,时间复杂度为O(N^2)
。
2、额外空间复杂度:O(1)
未借助其它辅助空间。