【java】选择排序及其优化

选择排序规则:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放待排序序列的起始位置(或末尾位置),直到全部待排序的数据元素排完

动态图:

 

代码

 

    public static void main(String[] args) {
        int[] arr = new int[] { 99, 54, 2, 12, 3, 33 };

        System.out.println(Arrays.toString(arr));
        selectSortOpt(arr);
        System.out.println(Arrays.toString(arr));
    }

    static void selectSort(int[] arr) {    
        for (int i = 0; i < arr.length; i++) {
            int minPos = i;
            for (int j = i + 1; j < arr.length; j++) {  // 只取最小值
                if (arr[minPos] < arr[j]) {
                    minPos = j;
                }
            }
            swap(arr, minPos, i);
        }
    }
    
    static void swap(int[] arr, int addr1, int addr2) {
        if (addr1 == addr2) {
            return;
        }
        arr[addr1] = arr[addr1] ^ arr[addr2];
        arr[addr2] = arr[addr1] ^ arr[addr2];
        arr[addr1] = arr[addr1] ^ arr[addr2];
    }
public static void main(String[] args) {
        int[] arr = new int[] { 65, 34, 88, 12, 100, 2 };

        System.out.println(Arrays.toString(arr));
        selectSort(arr);
        System.out.println(Arrays.toString(arr));
    }

    static void selectSort(int[] arr) {

        for (int i = 0; i < arr.length; i++) {
            int minPos = i;
            int maxPos = i;
            for (int j = i + 1; j < arr.length - i; j++) {
                if (arr[minPos] < arr[j]) {
                    minPos = j;
                }
                if (arr[maxPos] > arr[j]) {
                    maxPos = j;
                }
            }
            if (minPos == i && maxPos != arr.length - i - 1) { //1 min___   
                swap(arr, maxPos, arr.length - i - 1);
            } else if (minPos != i && maxPos == arr.length - i - 1) { // 1 ___max
                swap(arr, minPos, i);
            } else if (maxPos == i && minPos == arr.length - i - 1) { //2 max__min
                swap(arr, minPos, maxPos);
            } else if (maxPos != i && minPos == arr.length - i - 1) { //3 __min
                swap(arr, minPos, i);
                swap(arr, maxPos, arr.length - i - 1);
            } else  { //4 max__ + 其他
                swap(arr, maxPos, arr.length - i - 1);
                swap(arr, minPos, i);
            }
        }
    }

    static void swap(int[] arr, int addr1, int addr2) {
        if (addr1 == addr2) {
            return;
        }
        arr[addr1] = arr[addr1] ^ arr[addr2];
        arr[addr2] = arr[addr1] ^ arr[addr2];
        arr[addr1] = arr[addr1] ^ arr[addr2];
    }

 

这个只记住同时取最大值+最小值的算法就好,毕竟是优化算法

 

posted @ 2021-03-10 15:34  cdan134  阅读(75)  评论(0)    收藏  举报