选择排序(java实现)

核心思想

选择排序的核心思想是:从左往右遍历待排序数组,每次保存其中最小值的索引,将最小值与待排序数组的开头交换,再进行下一次遍历,直到待排序序列的长度为1。

代码

选择排序(遍历数组,每次从待排序列中选取最小值,放到数组的开头)
    public static void Selectsort(int[] arr) {
        int l = 0, r = arr.length - 1;
        while (l < r) {
            int min = l;
            for (int i = l; i <= r; i++) {//待排序列
                if (arr[i] < arr[min]) {
                    min = i;
                }
            }
            swap(arr, l, min);//将最小值放到数组前面
            l++;
        }
    }

代码改进

在遍历待排序数组寻找最小值的过程中,我们还可以同时保存最大值的索引,将最大值与待排序数组末尾进行交换,可以减少遍历次数,代码如下:

//优化选择排序(可以在每次遍历待排序列的时候,同时保存最大值和最小值的索引,分别将最大值和最小值放到数组的开头和结尾)
    public static void Selectsort(int[] arr) {
        int l = 0, r = arr.length - 1;
        while (l < r) {
            int min = l, max = l;
            for (int i = l; i <= r; i++) {
                if (arr[i] < arr[min]) {
                    min = i;
                }
                if (arr[i] > arr[max]) {
                    max = i;
                }
            }
            swap(arr, l, min);
            if (max == l) {//为防止最大值索引处的值被换走
                max = min;
            }
            swap(arr, r, max);
            l++;
            r--;
        }
    }

swap()方法的代码如下:

//数组内交换不同索引位置的值
    public static void swap(int[] arr, int i, int j) {
        int t = arr[i];
        arr[i] = arr[j];
        arr[j] = t;
    }

你可能感兴趣的:(算法,java,算法,数据结构)