3.选择排序

3.选择排序


前言

选择排序的含义就是因为每一次最内层for走一趟都会选择出一个最大或最小的数。


实现思路

比如有N个数,开始先选取第一个数( i= 0 )作为基准数。然后抛开这个数以以前的数,右边的数( i+1 To n-1 )走一趟for,找出最小(最大也行,看你是要升序还是降序),然后拿到这个最小的数,和基准数交换。然后下一次又重新定位基准数 i + 1,继续走右边的数一趟,找到最值,继续交换…….如此反复。


模拟走位

初始数组: [38, 17, 16, 16, 7, 31, 39, 32, 2, 11]

i = 0 :[ 2 , 17 , 16 , 16 , 7 , 31 , 39 , 32 , 38 , 11 ] ( 0th [38]<->8th [2] )

i = 1 :[ 2 , 7 , 16 , 16 , 17 , 31 , 39 , 32 , 38 , 11 ] ( 1st [17]<->4th [7] )

i = 2 :[ 2 , 7 , 11 , 16 , 17 , 31 , 39 , 32 , 38 , 16 ] ( 2nd [11]<->9th [16] )

i = 3 :[ 2 , 7 , 11 , 16 , 17 , 31 , 39 , 32 , 38 , 16 ] ( 无需交换 )

i = 4 :[ 2 , 7 , 11 , 16 , 16 , 31 , 39 , 32 , 38 , 17 ] ( 4th [17]<->9th [16] )

i = 5 :[ 2 , 7 , 11 , 16 , 16 , 17 , 39 , 32 , 38 , 31 ] ( 5th [31]<->9th [17] )

i = 6 :[ 2 , 7 , 11 , 16 , 16 , 17 , 31 , 32 , 38 , 39 ] ( 6th [39]<->9th [31] )

i = 7 :[ 2 , 7 , 11 , 16 , 16 , 17 , 31 , 32 , 38 , 39 ] ( 无需交换 )

i = 8 :[ 2 , 7 , 11 , 16 , 16 , 17 , 31 , 32 , 38 , 39 ] ( 无需交换 )

i = 9 :[ 2 , 7 , 11 , 16 , 16 , 17 , 31 , 32 , 38 , 39 ] ( 无需交换 )

总结:选择排序随着 i 的 增大,比较次数也相应的减少了,无论数组是否有序,都会从 数组的开始 到 数组结束进行一次比较。次数也是固定的 n + (n-1) + … + 2 + 1,而交换的次数也和初始化数组的排序有关。

所以:最坏的情况是,n次;最好的情况是,0次。


实现代码

    public <T extends Comparable<T>> T[] selectionSorting(T[] array, boolean ascend) {
        // 取得数组长度
        int len = array.length;
        //逐个选择比较
        for (int i = 0; i < len; i++) {
            int selected = i;
            /**
             * 与选择后的 其他元素比较
             * Comparable.compareTo() 方法
             * -1 : 小于
             *  0 : 等于
             *  1 : 大于
             */
            for (int j = i + 1; j < len; j++) {
                int compare = array[j].compareTo(array[selected]);
                /**
                 *  如果
                 *  array[j] != array[selected]
                 *  并且
                 *  array[j] 小于 array[selected]
                 *  都成立的时候
                 */
                if ((compare != 0 && compare < 0) == ascend) {
                    selected = j;
                }
            }

            /**
             * 基准数 和 被选择的交换
             * 当然要是没找到选择的数,那么被选择数一直没变是i
             * 也就是基准数自己和自己的交换
             */
            T t = array[i];
            array[i] = array[selected];
            array[selected] = t;
            System.out.print("i = " + i + "  array = ");
            for (T data : array) {
                System.out.print(data + " ");
            }
            System.out.println("");
        }
        return array;
    }

运行

    public static void main(String[] args) {
        /**
         * 选择排序
         */
        SelectionSort selectionSorting = new SelectionSort();
        Integer[] object = {38, 17, 16, 16, 7, 31, 39, 32, 2, 11};
        System.out.println("\n选择排序\n");
        Integer[] result = selectionSorting.selectionSorting(object, true);
        System.out.println("\n选择排序\n");
        for (int i : result) {
            System.out.print(i + " ");
        }

    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章