选择排序算法:每一趟找到最小的值,记录最小值index,交换最小值到最后结果位置。
/**
* 选择排序算法.
*
* @author peiyu
*/
public class SelectorSort {
public static List<Integer> sort(List<Integer> datas) {
for (int i = 0; i < datas.size() - 1; i++) {
int minIndex=i;
for (int j = i+1; j < datas.size(); j++) {
if (datas.get(minIndex)>datas.get(j)) {
minIndex=j;
}
}
if (minIndex!=i) {
Integer minValue = datas.get(minIndex);
datas.set(minIndex, datas.get(i));
datas.set(i, minValue);
}
System.out.println("【第" + (i+1) + "】趟结果:" + datas);
}
return datas;
}
public static void main(String[] args) {
List<Integer> datas = new ArrayList<Integer>();
for (int i = 0; i < 10; i++) {
datas.add(new Random().nextInt(100));
}
System.out.println("【排序前】:" + datas);
sort(datas);
System.out.println("【排序后】:" + datas);
}
}
测试结果:
【排序前】:[2, 11, 64, 79, 22, 94, 92, 96, 17, 21]
【第1】趟结果:[2, 11, 64, 79, 22, 94, 92, 96, 17, 21]
【第2】趟结果:[2, 11, 64, 79, 22, 94, 92, 96, 17, 21]
【第3】趟结果:[2, 11, 17, 79, 22, 94, 92, 96, 64, 21]
【第4】趟结果:[2, 11, 17, 21, 22, 94, 92, 96, 64, 79]
【第5】趟结果:[2, 11, 17, 21, 22, 94, 92, 96, 64, 79]
【第6】趟结果:[2, 11, 17, 21, 22, 64, 92, 96, 94, 79]
【第7】趟结果:[2, 11, 17, 21, 22, 64, 79, 96, 94, 92]
【第8】趟结果:[2, 11, 17, 21, 22, 64, 79, 92, 94, 96]
【第9】趟结果:[2, 11, 17, 21, 22, 64, 79, 92, 94, 96]
【排序后】:[2, 11, 17, 21, 22, 64, 79, 92, 94, 96]
选择排序的时间复杂度:简单选择排序的比较次数与序列的初始排序无关。 假设待排序的序列有 N 个元素,则比较次数永远都是N (N - 1) / 2。而移动次数与序列的初始排序有关。当序列正序时,移动次数最少,为 0。当序列反序时,移动次数最多,为3N (N - 1) / 2。
所以,综上,简单排序的时间复杂度为 O(N2)。