数据结构与算法之选择排序

选择排序也是排序算法当中比较基础的排序之一;

其核心思想就是将第一个元素与后面的所有元素进行比较,如果比其他的元素大就进行交换,则经过一次比较之后第一个元素就会变成最小的元素,然后第二次从第二个元素一直到最后一个进行此操作,选择出第二小的元素放在第二个位置,依此类推。

给定数组:7 4 3 9 5 1。


第一趟:将7与4进行比较,大于4交换位置。然后将4与3进行比较,大于3交换位置。然后3与9进行比较,小于9位置不变,与5比较小于5,位置不变,与1比较大于1交换位置。

第一趟排序后的结果为:1 7 4 9 5 3

同理可得第二趟的排序后结果为:1 3 7 9 5 4

第三趟:1 3 4 9 7 5

第四趟:1 3 4 5 9 7

第五趟:1 3 4 5 7 9

排序完成。

下面是算法程序的实现:

public static void sort(int[] arr, int n){
        for (int i = 0; i < n; i++) {
            for (int j = i; j < n; j++) {
                if (arr[i] > arr[j]){
                    swap(arr, i, j);
                }
            }
        }
    }


下面来考虑一下优化。我们每趟排序的时候选择出一个最小值,排序n-1次,比较的次数也是由n-1到1.显然时间复杂度是O(n²)

如果我们每次在决出一个最小值得同时决出一个最大值的话,效率明显会提升不少,循环的次数也会减半。

下面是优化后的程序。

public static void sort(int[] arr, int n){
        int left = 0;
        int right = n-1;
        int min = 0;
        int max = 0;
        while (left < right){
            min = left;
            max = right;
            for (int i = left; i <= right; i++) {
                if (arr[i] < arr[min]){
                    min = i;
                }
                if (arr[i] > arr[max]){
                    max = i;
                }
            }
            swap(arr, left, min);
            if (left == max){//如果在一次循环中,最大值刚好是最左边的元素,那么交换后的最大值下标就是min了,所以将min赋值给最大值的下标即可
                System.out.println(arr[left]);
                max = min;
            }
            swap(arr, right, max);
            left++;
            right--;

        }
    }


猜你喜欢

转载自blog.csdn.net/qq_21963133/article/details/79661469