选择排序

选择排序对冒泡排序进行了改进,将交换次数从O(n2)降低到了O(n),比较次数仍然是O(n2)

情景:对数组 int[] arr = {6,9,5,2,8,7}中的数据 从小到大排序。

思路:在第一趟排序中,从下标为0开始选择出最小的数字,和arr[0]进行交换,此时,最左侧的数字已经是有序状态了。在第二趟排序中,从下表为1开始选择出最小的数字,然后和arr[1]进行交换,以此类推。注意,红色数字表示已排序。

第一趟排序后: 2 5 6 8 7 9

第二趟排序后: 2 5 6 8 7 9

第三趟排序后: 2 5 6 8 7 9

第四趟排序后: 2 5 6 7 8 9

第五趟排序后: 2 5 6 7 8 9 

代码:

/**
 * 选择排序
 * @author D N
 *
 */
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 j=0;j<nElems;j++){
            System.out.print(a[j]+"   ");
        }
        System.out.println("");
    }
    
    public void swap(int one,int two){
        long temp = a[one];
        a[one] = a[two];
        a[two] = temp;
    }
    
    //选择排序算法
    public void selectSort(){
        int in,out,min;
        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);
        }
    }
    
}

运行测试代码:

public class SortTest {
    public static void main(String[] args) {
        int maxSize = 10;
        SelectSort arr = new SelectSort(maxSize);
        arr.insert(6);
        arr.insert(9);
        arr.insert(5);
        arr.insert(2);
        arr.insert(8);
        arr.insert(7);
        arr.display();
        arr.selectSort();
        arr.display();
    }
}

结果:

6   9   5   2   8   7   
2   5   6   7   8   9   

效率分析:

选择排序的时间复杂度是O(n2),不过选择排序交换的次数比冒泡排序要少,所以相比冒泡排序,效率要高一些。

posted @ 2019-01-23 13:31  51life  阅读(145)  评论(0编辑  收藏  举报