选择排序原理
① 每一次遍历的过程中,都假设未排序的序列的第一个索引处的元素为最小值,依次遍历其他元素与这个最小值进行比较,如果当前索引处的值大于其他某个索引处的值为最小值,最后可以找到最小值所在位置的索引。
② 交换第一个索引处和最小值所在索引处的值。
简单来说,就是每次遍历都把未排序的序列的最小值放到序列的最前端。
图片转载自:https://www.bilibili.com/video/BV1iJ411E7xW?p=15
如图所示,第一次遍历时将最小值索引设置为0,对应的值大小为4。依次向右遍历,4小于6、8、7、9,因此最小值索引仍为0。继续遍历,4大于2,因此最小值索引变为5。继续向后,10大于2,1小于2,因此最小值索引变为7。
最后索引0处的值与索引7处的值进行交换。
此时,索引0处(及之前)的值为有序的序列,接下来只需要对索引1到索引7之间的序列进行排序即可。
public class Select {
public static void sort(Comparable[] a){
for(int i = 0;i < a.length-1; i++){ // 每次排序需要操作的元素个数 第一次需要遍历所有元素,每次减少一个
int minIndex = i; // 最小值的索引
for(int j = i+1; j < a.length; j++){ // 需要与最小值比较的元素的个数
if(greater(a[minIndex],a[j])){
minIndex = j; // 更新最小值索引
}
}
exch(a,i,minIndex);
}
}
private static Boolean greater(Comparable v, Comparable w){ // 比较函数 v>w时 返回True
return v.compareTo(w)>0;
}
private static void exch(Comparable[] a, int i, int j){ // 交换指定索引处的值
Comparable temp;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}