勿忘初心,奋起直追

在网上经常看到这种伪选择排序算法,包括自己在第一次编写选择排序时也编写了如下的效率不高的代码:

publi class FalseSort {  

public FalseSort(){  

    int a[]={1,54,6,3,78,34,12,45};  

    int temp=0;  

    for(int i=0;i<a.length;i++){  

       for(int j=i+1;j<a.length;j++){  

       if(a[i]>a[j]){  

           temp=a[i];  

           a[i]=a[j];  

           a[j]=temp;  

       }  

       }  

    }  

    for(int i=0;i<a.length;i++)  

       System.out.println(a[i]);     

}  

}

在代码第二层for循环中做了一次交换,两层for循环后可能要做n(n-1)/2次交换. 但在实际的选择排序中,只做n次交换就可以了.真正的选择排序是每次记录最小元素的下标,直到最后才进行交换 example

// 选择排序
    public void selectSort(){
        int min = 0;
        long tmp = 0L;
        for(int i = 0; i < elems -1; i++){
            min = i;
            for(int j = i + 1; j < elems; j++) {
                if(arr[j] < arr[min]) {
                    min = j;
                }
            }
            tmp = arr[i];
            arr[i] = arr[min];
            arr[min] = tmp;
        }
    }