java排序之选择排序

      选择排序改进了冒泡排序,所改进的是排序时交换的次数,并没有改进比较的次数。在大批量数据排序的时候,选择排序中对于交换数据的时间和比较的时间来说,很显然,数据交换和移动的时间更为重要(一般来说,Java中不是这种情况,Java中只是改变了引用的位置,而实际对象的位置并未发生改变)

    用选择排序对篮球队员进行排序:

进行选择排序就是把所有的队员扫描一遍,找到其中最低的队员,让他与最左边的队员(0号位置)进行交换(如果最左边的队员就是最低的,那么不进行交换)。这样最左边的队员就是有序的状态,不需要再次交换位置了。注意,这个算法中呢,有序的都排列在队伍的最左边,与冒泡排序相反(冒泡排序是从最右边)。再次扫描队列时,就是从1号位置开始,也是找到最矮的,与队列的1号位置进行交换,那么依次下去,一直持续到整个顺序排列完成。

第一次扫描:

java排序之选择排序_第1张图片

第二次扫描:

java排序之选择排序_第2张图片

第三次扫描:

java排序之选择排序_第3张图片

 依次如图所示。

接下来上代码:

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]                     min = in;
                }
            }
            swap(out, min);
        }
    }
}

out:用来记录外层循环,从数组开头0开始,依次增长。

in:用来记录内层循环,找到每一轮的最矮队员,并将他与这一轮起始的队员进行交换。

min:用来记录当前最矮的队员。

选择排序的效率:选择排序与冒泡排序进行了同样次数的比较,N*(N-1)/2,但是一列数组如果有10个数据项,只需要少于10次的比较就可以了。如果数据量N约大,那么选择排序就会比冒泡排序节省很多时间(在数据交换位置上节省),数据量很小的情况下,两者相当。

 

你可能感兴趣的:(java,java,选择排序,冒泡排序)