选择排序算法

本文再次探讨选择排序算法,通过挑选最小元素并交换的方式实现排序。算法时间复杂度为O(n^2),相较于冒泡排序,选择排序能减少不必要的值交换。通过案例实践,加深对该算法的理解。
算法笔记–再回顾选择排序

选择排序很符合人类的直觉,它的核心就是从无序的元素中挑选出有序的元素,可以用一篮子苹果来形象描述这个过程,首先我们从篮子中挑选出最小的一个,然后继续从篮子中挑选出最小一个,这时手中就得到了两个比较小的苹果排序,重复此过程,直至篮子的苹果被挑选完,可见这样的挑选过程本身也是排序过程。

解题:用一个数组来表示元素集合

  1. 选定第一个元素,与数组其他元素遍历比较,找到最小的一个,然后交换,此时挑选出最小值
  2. 选定第二个元素,与剩下的数组(篮子中的苹果)元素遍历比较,找到最小的一个,然后交换,此时挑选出次小值
  3. 重复步骤直至数组完全排序

时间复杂程度:

  • O(n^2)

选择排序与冒泡法比较,选择排序明显减少了值的交换次数

案例实践

public class SelectSort {

    public static void main(String[] args) {
        int[] a = {5,6,1,2,3,4,7,8,9};
        sort(a);
//        sortOptimize(a);
        for (int i = 0; i < a.length; i++) {
            System.out.printf("%2d",a[i]);
        }
    }

    private static void sort(int arr[]){
        int k = 0;
        for (int n = 0; n < arr.length - 1; n++) {
            int min = arr[n]; // 先假定第一个数为最小值
            int minIndex = n;
            for (int j = n + 1; j < arr.length; j++) {
                // 挨个与最小值对比,如果小于,则进行交换
                if (min > arr[j]) {
                    // 如果后面的值比当前的 min 小,则重置为这个数
                    min = arr[j];
                    minIndex = j;
                }
                k++;
            }
            // 第 n 轮结束后,得到了最小值
            // 将这个最小值与 arr[n] 交换
            arr[minIndex] = arr[n];
            arr[n] = min;
//            System.out.println("第 " + (n + 1) + " 轮排序后:" + Arrays.toString(arr));
        }
        System.out.println("选择排序循环的次数: " + k);
    }

    /**
     * 选择排序优化,对于已经排序好的数据可以明显减少循环次数
     * @param arr
     */
    private static void sortOptimize(int arr[]){
        int k = 0;
        boolean change = false;
        for (int n = 0; n < arr.length - 1; n++) {
            int min = arr[n]; // 先假定第一个数为最小值
            int minIndex = n;
            change = true;
            for (int j = n + 1; j < arr.length; j++) {
                // 挨个与最小值对比,如果小于,则进行交换
                if (min > arr[j]) {
                    // 如果后面的值比当前的 min 小,则重置为这个数
                    min = arr[j];
                    minIndex = j;
                }
                //判断接下的元素是否都是有序的
                if(j < arr.length -1 && arr[j] > arr[j+1]){
                    change = false;
                }
                k++;
            }
            // 第 n 轮结束后,得到了最小值
            // 将这个最小值与 arr[n] 交换
            arr[minIndex] = arr[n];
            arr[n] = min;
//            System.out.println("第 " + (n + 1) + " 轮排序后:" + Arrays.toString(arr));
            if (change){
                break;
            }
        }
        System.out.println("选择排序循环的次数: " + k);
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值