选择排序从字面的解释就是先从一个数组中选择出一个,然后再按照一定规则选择出一个,直到全选择完,也就拍完序了。
具体解释如下:(以升序为例)
step1:先取出数组的第一个元素a[0],然后再后面是所有数据选择,只要有比a[0]小的值,那就把最小值的坐标更新,等全部比较完,把a[0]和a[min]交换
step2:在取出a[1],按照第一步的规律,在a[1]后面找比a[1]小的,然后把最小值的坐标进行更新,直到全部比较完,将a[1] 和a[min]换
step3:按照规律进行下去,哪怕a[i]已经是最小的了,那么也要a[i]和a[i]换,直到把所有数据都交换完
由算法可知:对于长度为N的数组,选择排序需要大约N^2/2次比较(相当于一个方阵的右对角线的半面全部比较了一遍),交换需要N次
选择排序的运行时间与数组输入的初始化顺序无关
具体实现如下
public static <T> void sort(Comparable<t> a){
int N = a.length()
//按升序排列
for(int i = 0; i < N; i++){
//将a[i]和a[i+1..N]中最小的元素交换
int min = i; //最小元素的索引
for(int j = i + 1; j < N; j++){
if(less(a[j],a[min]))
min = j;
}<pre name="code" class="java"> exch(a,i,min);
}}
测试程序如下:
</pre><pre>
public class Selection {
public static <T> void sort(Comparable<T>[] a){
// 将a[] 升序排列
int N = a.length;
for (int i = 0; i < N; i++) {
//将a[i]和a[i+1, ...,N]中最小的元素交换
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 <T>boolean less(Comparable<T> v, Comparable<T> w){
return v.compareTo((T) w) < 0;
}
private static <T> void exch(Comparable<T>[] a, int i, int j){
Comparable<T> t = a[i];
a[i] = a[j];
a[j] = t;
}
private static <T> void show(Comparable<T>[] a){
//在单行中打印数组
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
}
public static <T> boolean isSorted(Comparable<T>[] a){
//测试数组元素是否有序
for (int i = 0; i < a.length; i++) {
if(less(a[i], a[i-1]))
return false;
}
return true;
}
public static void main(String[] args) throws FileNotFoundException {
// TODO Auto-generated method stub
// String[] a = {"S","O","R","T","E","X","A","M","P","L","E"};
Integer[] a = {-5,8,9,5,7,1,-68,1,5,33,100,563,526,16,21,68,-88};
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.println();
sort(a);
assert isSorted(a);
show(a);
}
}
测试结果
S O R T E X A M P L E
A E E L M O P R S T X