选择排序
流程
-
外循环:依次遍历每个元素,下标作为最小值索引,对应元素作为最小值。
-
内循环:依次遍历外层下标以后的每一个元素,进行:
- 与最小值比较,若小于最小值,则更新当前下标为最小值索引。
- 遍历完毕,交换最小值。
特点
-
运行时间与输入无关。都为(frac{1}{2}N^2)
-
数据移动最小,与数组大小 N 成正比。
-
选择的含义体现在每次内循环都选出了最小的元素。
代码如下:
public class Selection{
//对外提供排序方法
public static void sort(Comparable[] a){
for(int i=0;i<a.length;i++){
//最小值对应的索引
int min=i;
for(int j=i+1;j<a.length;j++){
if(less(a[j],a[min])){
min=j;
}
}
exch(a,i,min);
}
}
//判断前者是否小于后者
private static boolean less(Comparable a,Comparable b){
return a.compareTo(b)<0;
}
//两者交换
private static void exch(Comparable[] a,int i,int j){
Comparable t=a[i];
a[i]=a[j];
a[j]=t;
}
//判断是否有序(自然序)
private static boolean issort(Comparable[] a){
for(int i=0;i<a.length-1;i++){
if(less(a[i+1],a[i])){
return false;
}
}
return true;
}
//对外提供展示方法
public static void show(Comparable[] a){
for(Comparable c:a){
System.out.println(c);
}
}
public static void main(String[] args) {
Integer[] a={8,7,6,8,2,4,5,2,1};
sort(a);
System.out.println(issort(a));
show(a);
}
}