每天一个算法(3):选择排序(java)

选择排序

选择排序另一种非常基本的排序算法, 也和我上一篇写的插入排序一样将数组分为有序和无序两个部分, 而选择排序是将无序数组部分的最最小(最大)和有序部分比较交换。
示意:
原数组:[10, 3, 2, 1, 0, 5, 4, 8, 7, 9]
最小值是:0 –> 下标 : 4 第0次: [0, 3, 2, 1, 10, 5, 4, 8, 7, 9]
最小值是:1 –> 下标 : 3 第1次: [0, 1, 2, 3, 10, 5, 4, 8, 7, 9]
最小值是:2 –> 下标 : 3 第2次: [0, 1, 2, 3, 10, 5, 4, 8, 7, 9]
最小值是:3 –> 下标 : 3 第3次: [0, 1, 2, 3, 10, 5, 4, 8, 7, 9]
最小值是:4 –> 下标 : 6 第4次: [0, 1, 2, 3, 4, 5, 10, 8, 7, 9]
最小值是:5 –> 下标 : 6 第5次: [0, 1, 2, 3, 4, 5, 10, 8, 7, 9]
最小值是:7 –> 下标 : 8 第6次: [0, 1, 2, 3, 4, 5, 7, 8, 10, 9]
最小值是:8 –> 下标 : 8 第7次: [0, 1, 2, 3, 4, 5, 7, 8, 10, 9]
最小值是:9 –> 下标 : 9 第8次: [0, 1, 2, 3, 4, 5, 7, 8, 9, 10]
最小值是:10 –> 下标 : 9 第9次: [0, 1, 2, 3, 4, 5, 7, 8, 9, 10]
现数组:[0, 1, 2, 3, 4, 5, 7, 8, 9, 10]
代码:

/**
 * 选择排序
 */
public class SelectSort {

    public static void select_sort(int arr[]){
        int temp, index = 0;
        for(int i = 0; i < arr.length; i++){
            int min = arr[i];
            /**
             * 查找每一次[i+1, arr.length]之间的最小值和最小值下标并保存
             */
            for(int j = i + 1; j < arr.length; j++){
                if(arr[j] < min){
                    min = arr[j];
                    index = j;
                }
            }
            System.out.print("最小值是:" + min + " --> 下标 : " + index);
            /**
             * 比较arr[i] 和 arr[index] ; if arr[i] > arr[index]  交换;
             */
            if(arr[i] > min){
                temp = arr[i];
                arr[i] = min;
                arr[index] = temp;
            }
            System.out.println("   第" + i + "次: " + Arrays.toString(arr));
        }

    }

    public static void main(String[] args){
        int arr[] = new int[] {10, 3, 2, 1, 0, 5, 4, 8, 7, 9};
        System.out.println("原数组:");
        System.out.println(Arrays.toString(arr));
        SelectSort.select_sort(arr);
        System.out.println("现数组:");
        System.out.println(Arrays.toString(arr));
    }

}

时间复杂度分析
因为算法的核心是内循环其子数组所以最坏情况、最好情况、平均情况时间复杂度是一样的 O(n^2)

猜你喜欢

转载自blog.csdn.net/yhflyl/article/details/80841562