基于选择排序的一些想法

选择排序的工作原理是,每一次从待排序的数据中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。

优化思路是,每次循环都同时找出最大和最小的值,分别放在序列的首部和尾部。这样我们在进行外层循环时,只需要遍历序列的一半,就可以完成排序。

实现思路,假设序列的第一个元素是最小的,从第二个元素开始,遍历数组碰见比第一个元素小的就和他交换位置。同理将每个元素和最后一个比较,若是大于最后一个元素,把这个元素和最后一个交换。这样每一轮循环都可以保证首尾是最小最大值。

代码如下:

static Scanner sc = new Scanner(System.in);
    public static void main(String[] args) {
        int[] a = new int[10];
        int[] b = new int[10];
        // 输入一个待排序的数组
        System.out.println("请输入10个数字:");
        for (int i = 0; i < a.length; i++) {
            a[i] = sc.nextInt();
        }
        // 排序,每次确定首位两个元素。
        int temp;
        for (int i = 0; i < a.length / 2 + 1; i++) {
            for (int j = i; j < a.length; j++) {
                if (a[j] < a[i]) { // 找到最小值
                    temp = a[j];
                    a[j] = a[i];
                    a[i] = temp;
                }
                if (a[j] > a[a.length - i - 1]) { // 找到最大值
                    temp = a[j];
                    a[j] = a[a.length - i - 1];
                    a[a.length - i - 1] = temp;
                }

            }
        }
        // 解决中间的元素不会被比较的问题
        int count = (a.length - 1) / 2;
        temp = a[count];
        for (int i = count; i < a.length - 1; i++) {
            a[i] = a[i + 1];
        }
        a[a.length - 1] = temp;

        // 输出语句
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + " ");
        }

    }

 

猜你喜欢

转载自blog.csdn.net/qq_43672627/article/details/86657391
今日推荐