选择排序是一种基础简单的排序方法。
原理
1.遍历数组,假设第一个索引处的元素为最小元素,用min来标记该索引。之后依次和其他索引处的元素进行比较,如果当前索引处元素小于min索引处元素,则修改min值为当前索引。最后可以找到最小值元素的索引
2.交换当前数组中min索引处元素和第一个索引处元素的位置
3.假设数组的大小为n,重复步骤1和步骤2 (n-1)次,可以完成排序
代码
public class Selection {
//交换a数组中索引x和索引y处的元素
private static void exch(Comparable[]a,int x,int y){
Comparable temp=a[x];
a[x]=a[y];
a[y]=temp;
}
//判断a元素是否小于b元素
private static boolean less(Comparable a,Comparable b){
return a.compareTo(b)<0;
}
public static void sort(Comparable[]a){
final int N=a.length;
//外层循环次数为N-1次
for (int i = 0; i <N-1; i++) {
//min标记最小处元素的索引
int min=i;
for (int j =i+1; j <N; j++) {
if(less(a[j],a[min]))min=j;
}
//交换当前第一个索引处的元素和min索引处的元素
exch(a,i,min);
}
}
public static void main(String[] args) {
Integer[]a=new Integer[50];
for (int i = 0; i < a.length; i++) {
a[i]=(int)(Math.random()*50);
}
System.out.println("排序前");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+" ");
}
System.out.println("排序后");
sort(a);
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+" ");
}
}
}
复杂度分析
- 时间复杂度:比较次数为(n-1)+(n-2)…+1,交换次数为n-1次;总数为(n+2)(n-1)/2~(n2),因此时间复杂度为O(n2)