选择排序算法的基本思想:
首先, 找到数组中最小的一个, 其次, 将它和数组的第一个元素交换位置, (如果第一个是自己就和自己交换)。 再次,在剩下的元素中查找最小的一个,将它与第二个元素交换位置。如此往复,直到整个数组排序完成,这种排序算法叫做--选择排序(不断的选择剩余元素中的最小者)
选择排序算法的特点:
1,运行时间和输入无关;
2, 数据的移动是最小的;
代码实现如下:
首先定义一个算法实现模板类
/**
* 类AbstractArithmeticLogicTemplate.java的实现描述:抽象的算法逻辑模板
*
* @author wangyangchao 2019年3月23日 下午1:13:46
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public abstract class AbstractArithmeticLogicTemplate {
public abstract void sort(Comparable[] a);
public boolean less(Comparable v, Comparable w) {
return v.compareTo(w) < 0;
}
public void exch(Comparable[] a, int i, int j) {
Comparable t = a[i];
a[i] = a[j];
a[j] = t;
}
public void show(Comparable[] a) {
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + ",");
}
System.out.println();
}
public boolean isSorted(Comparable[] a) {
for (int i = 1; i < a.length; i++) {
if (less(a[i], a[i - 1]))
return false;
}
return true;
}
}
选择算法的具体实现代码:
/**
* 类Selection.java的实现描述:选择排序算法
*
* @author wangyangchao 2019年3月23日 下午1:11:20
*/
public class Selection extends AbstractArithmeticLogicTemplate {
@Override
public void sort(Comparable[] a) {
int len = a.length;
for (int i = 0; i < len; i++) {
int minIndex = i;
for (int j = i; j < len; j++) {
if (less(a[j], a[minIndex])) {
minIndex = j;
}
}
this.exch(a, i, minIndex);
}
}
public static void main(String[] args) {
Selection selection = new Selection();
Comparable[] a = new String[] { "k", "d", "a", "b", "c" };
selection.sort(a);
selection.show(a);
}
}
运行结果:
a,b,c,d,k,
结论:
对于长度为N的数组,选择排序需要大约N^2/2 次比较 和N次的位置交换。交换次数和数组的大小是线性正相关。