01选择排序

2019-04-09  本文已影响0人  飞奔吧牛牛

原理:

数组array = {2,15,7,9,30, 1, 5}

口语描述:找出最小(大)的放到第一个位置,再从剩下的数中找到最小(大)的放到第二个位置,再从剩下的数中找到最小(大)的放到第三个位置。。。。一直找到最后

假设最小值的下标为min(默认为0),

第一次:从array[0]开始,找到array[0]~array[n]最小的值:array[min],
交换array[0] 和 array[min]。

第二次:从array[1]开始,找到array[1]~array[n]最小的值:array[min],交换array[1] 和 array[min]。

第三次:从array[2]开始,找到array[2]~array[n]最小的值:array[min],交换array[2] 和 array[min]。

。。。。。。
一直循环到倒数第二个即可

代码:


/**
 * 选择排序:最简单但是最没用的排序算法
 * 
 * */
public class Sort01_Select {
    
    public static void main(String[] args) {
        int[] array = {2,15,7,9,30, 1, 5};
        selectSort(array);
        for (int i : array) {
            System.out.print(i);
            System.out.print(" ");
        }
    }
    

    /**
     * 时间复杂度:
     * 当数组长度为n时,i和j的取值范围以及循环次数:
     * 
     * 范围           |   次数
     * i∈[0, n-2]   |   n-1
     * --------------------
     * j∈[1, n-1],  |   n-1
     * j∈[2, n-1],  |   n-2
     * ...          |   ...
     * j∈[n-2, n-1],|   2
     * j∈[n-1],|    1
     * 
     * 内层循环一共执行了(n-1)+(n-2)+...+1=(n² - n)/2次,
     * 忽略低次项,忽略常数项,取最高次n²
     * 得到时间复杂度为:O(n²)
     */
    public static void selectSort(int[] array) {
        int minIndex = 0;
        for (int i = 0; i < array.length - 1; i++) {
            minIndex = i;
            for (int j = i + 1; j < array.length; j++) {
                if (array[minIndex] > array[j]) {
                    minIndex = j;
                }
            }
            //交换
            if (array[minIndex] < array[i]) {
                int temp = array[i];
                array[i] = array[minIndex];
                array[minIndex] = temp;
            }
        }
    }
}

打印结果:

1 2 5 7 9 15 30 
上一篇 下一篇

猜你喜欢

热点阅读