选择排序改进了冒泡排序,所改进的是排序时交换的次数,并没有改进比较的次数。在大批量数据排序的时候,选择排序中对于交换数据的时间和比较的时间来说,很显然,数据交换和移动的时间更为重要(一般来说,Java中不是这种情况,Java中只是改变了引用的位置,而实际对象的位置并未发生改变)
用选择排序对篮球队员进行排序:
进行选择排序就是把所有的队员扫描一遍,找到其中最低的队员,让他与最左边的队员(0号位置)进行交换(如果最左边的队员就是最低的,那么不进行交换)。这样最左边的队员就是有序的状态,不需要再次交换位置了。注意,这个算法中呢,有序的都排列在队伍的最左边,与冒泡排序相反(冒泡排序是从最右边)。再次扫描队列时,就是从1号位置开始,也是找到最矮的,与队列的1号位置进行交换,那么依次下去,一直持续到整个顺序排列完成。
第一次
第二次
第三次
依次如图所示。
接下来上代码:
public class selectSort {
private long[] a;
private int nElems ;
public selectSort(int max) {
a = new long[max];
nElems = 0;
}
public void insert(long value) {
a[nElems] = value;
nElems++;
}
public void display() {
for (int i = 0; i < nElems-1; i++) {
System.out.println(a[i]+"");
}
System.out.println("");
}
public void swap(int one , int two) {
long temp = a[one];
a[one] = a[two];
a[two] = temp;
}
public void selectSortApp() {
int min ,in ,out ;
for ( out = 0; out < nElems-1; out++) {
min = out ;
for ( in = out+1; in < nElems; in++) {
if(a[in]<a[min]){
min = in;
}
}
swap(out, min);
}
}
}
out:用来记录外层循环,从数组开头0开始,依次增长。
in:用来记录内层循环,找到每一轮的最矮队员,并将他与这一轮起始的队员进行交换。
min:用来记录当前最矮的队员。
选择排序的效率:选择排序与冒泡排序进行了同样次数的比较,N*(N-1)/2,但是一列数组如果有10个数据项,只需要少于10次的比较就可以了。如果数据量N约大,那么选择排序就会比冒泡排序节省很多时间(在数据交换位置上节省),数据量很小的情况下,两者相当。