基本思路:
1.找到未排序的数组中最小的那个元素,用下标为min来标记此为最小的元素
2.将它和未排序数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)
3.如此往复,直到将整个数组排序。
public class Selection {
//排序
public static void sort(Comparable[] a)
{
int N = a.length;
for(int i=0;i<N;i++)//总共比较多少趟,每一趟确定前面的一个数据
{
int min = i;//假设最小数据是未排序中的第一个数据
for(int j=i+1;j<N;j++)//这一趟需要比较的次数
{
if(less(a[j],a[min]))//如果比假设的最小数小
min = j;//则将其下标标记为最小数的下标,内层循环找到最小数的下标
}
exch(a,i,min);//交换最小数和未排序的第一个数据的位置
}
}
//比较大小
private static boolean less(Comparable v,Comparable w)
{
return v.compareTo(w) < 0;
}
//交换
private static void exch(Comparable[] a,int i,int j)
{
Comparable swap = a[i];
a[i] = a[j];
a[j] = swap;
}
//测试
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int N = cin.nextInt();
Integer[] a = new Integer[N];
for(int i=0;i<N;i++)
{
a[i] = cin.nextInt();
}
sort(a);
for(int i=0;i<a.length;i++)
System.out.print(a[i]+" ");
}
}
时间复杂度分析
寻找开销:和输入序列本身无关,它总是要查看所有项来寻找最小项。所以为平方时间
移动开销:每一个元素只需要交换一次就到最终位置,线性次数的交换。
最大的问题在于如果序列本身就是有序的,那么它还是会一遍遍的找最小项。