概述
在要排序的一组数中,选出最小的一个数与第1个位置的数交换;然后在剩下的数当中再找最小的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。
换句话说:
以 i
代表当前需要排序的序号,则需要在剩余的 [i... n-1]
中找出其中的最小值,然后将找到的最小值与 i
指向的值进行交换。因为每一趟确定元素的过程中都会有一个选择最大值的子流程,所以人们形象地称之为选择排序。选择排序的时间复杂度和空间复杂度分别为 O(n2)
和 O(1)
。
直观释义图:
步骤
从
n
个记录中找出关键码最小的记录与第一个记录交换从第
2
个记录开始的n-1
个记录中再选出最小的记录与第2
个记录交换从第
i
(i
是不断+1
的)个记录开始的n-i+1
个记录中选出最小的与第i
个记录交换直到整个序列有序
实例
原始数据:
3 5 2 6 2
第一轮,找出 [5 2 6 2]
中最小的第三个位置 2 ,与第一个位置 3 进行交换
2 5 3 6 2
第二轮,找出 [3 6 2]
中最小的 2 与第一轮中第二个位置 5 进行交换
2 2 3 6 5
第三轮,找出 [6 5]
中最小的 5 与第二轮中第三个位置 3 不需交换
2 2 3 6 5
第四轮,找出 [5]
中最小的 5 与第三轮中的第四个位置 6 进行交换
2 2 3 5 6
第五轮,没有了,最终结果
2 2 3 5 6
简单选择排序也可以认为是稳定的排序。
代码实现(Java)
package com.coder4j.main.arithmetic.sorting;
public class SimpleSelection {
/**
* 简单选择排序
*
* @param array
* @return
*/
public static int[] sort(int[] array) {
for (int i = 0; i < array.length; i++) {
System.out.println("第" + (i + 1) + "轮比较结果:");
int minPosition = i;
// 找出i之后的数组中的最小索引
for (int j = i + 1; j < array.length; j++) {
if (array[j] < array[minPosition]) {
minPosition = j;
}
}
// 判断是否需要调换位置
if (array[i] > array[minPosition]) {
int temp = array[i];
array[i] = array[minPosition];
array[minPosition] = temp;
}
// 输出此轮排序结果
for (int k : array) {
System.out.print(k + " ");
}
System.out.println();
}
return array;
}
public static void main(String[] args) {
int[] array = { 3, 5, 2, 6, 2 };
int[] sorted = sort(array);
System.out.println("最终结果");
for (int i : sorted) {
System.out.print(i + " ");
}
}
}
测试输出结果:
第1轮比较结果:
2 5 3 6 2
第2轮比较结果:
2 2 3 6 5
第3轮比较结果:
2 2 3 6 5
第4轮比较结果:
2 2 3 5 6
第5轮比较结果:
2 2 3 5 6
最终结果
2 2 3 5 6
经测试,与实例中结果一致。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。