选择排序及其复杂度
Posted Vincent(朱志强)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了选择排序及其复杂度相关的知识,希望对你有一定的参考价值。
选择排序
什么是选择排序
选择排序是通过不断地从元素中选出最小的元素放在它应该所处的位置上。例如第i
次选出的元素应该位于数组的Array[i]
处,如果不是,则将其与之交换位置,i
从0开始计数。
也就是说,不断地从无序区域选择出最小的元素,放在无序区域的头部,也就是有序区域的末尾,这个元素是当前无序区域的最小元素,同时是有序区域的最大元素,本次选择过后,它成为有序区域的最后一个元素。不断地重复这个过程,直至所有元素都处在正确的位置上。初始状态下,整个数组是无序区域,有序区域为空集。
选择排序的工作机制
以数组[20,12,10,15,2]
为例,看一下选择排序的工作机制。
第0轮选择
-
将第一个元素
Array[0]
当作最小的元素min
将第一个元素当作最小元素 min
-
比较
min
与第二个元素Array[1]
的大小,如果Array[1]
小于min
,则将Array[1]
赋值给min
,否则什么都不做。以此类推,直到比较完min
与最后一个元素Array[n-1]
的大小。比较min与剩余元素的大小 -
一轮选择下来,最小元素
min
放在了无序区域的头部Array[0]
,它成为有序区域的尾部。交换 min
与Array[0]
的位置
以此类推,整个的选择过程如下
第0轮选择 |
---|
第1轮选择 |
---|
第2轮选择 |
---|
第3轮选择 |
---|
伪代码
selectionSort(array, size)
repeat (size - 1) times
set the first unsorted element as the minimum
for each of the unsorted elements
if element < currentMinimum
set element as new minimum
swap minimum with first unsorted position
end selectionSort
java实现
void selectionSort(int[] numbers)
//检查入参,如果numbers为null或size < 2,则无需排序
if (numbers == null || numbers.length < 2)
return;
//每一轮都是将无序区域[round-numbers.length-1]中最小的元素选出并放至numbers[round]位置
for (int round = 0; round < numbers.length - 1; round++)
//保存最小元素的索引
int minIndex = round;
for (int index = round + 1; index < numbers.length; index++)
//如果index处的元素小于minIndex处的值,则将其赋值给minIndex
if (numbers[index] < numbers[minIndex])
minIndex = index;
// 如果当前一轮选择的最小元素不在它应处的位置(numbers[round]),则交换它们
if (round != minIndex)
int temp = numbers[minIndex];
numbers[round] = numbers[minIndex];
numbers[minIndex] = temp;
复杂度及稳定性
时间复杂度 | 空间复杂度 | 稳定性 |
---|---|---|
最好 O ( n 2 ) O(n^2) O(n2)最差 O ( n 2 ) O(n^2) O(n2)平均 O ( n 2 ) O(n^2) O(n2) | O ( 1 ) O(1) O(1) | 不稳定 |
以上是关于选择排序及其复杂度的主要内容,如果未能解决你的问题,请参考以下文章