选择排序+优化

定义

它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

步骤
  1. 假设我们拿到的起始位置的数值是最小的
  2. 拿起始位置的值与后面所有数值进行比较
  3. 选择数值比较小的数值的角标与临时变量里存放的角标进行交换
  4. 确定第一个有序值
//i:要排第几个
//j:用来进行比较
//temp:临时变量用来存放最小值
//arr[]:定义一个带比较的数组
public class XuanZeSort {
    //选择排序
    public static void xuanZeSort(int[] arr){
        //可以写成i < arr.length-1
        //如果代派数组是5个数,前四个都有序后第5个没有必要再进行一次比较
        for(int i = 0; i < arr.length-1; i++){
            int temp=arr[i];
            //将下标为0的数与下标为1的数进行比较
            //也就是i与j进行比较
            for(int j = i+1; j< arr.length; j++){
                //如果临时变量存放角标为i的值比arr[j]大
                //将临时变量的值与角标为j的值进行交换
                if(arr[j] < temp){
                    temp = arr[j];
                    arr[j] = arr[i];
                    arr[i] = temp;
                }
            }
            //PrintArray.printArray(arr);
        }
        PrintArray.printArray(arr);
    }
}
  • 这样排序没做一次比较就会进行一次数组下角标的交换比较浪费空间,时间复杂度和空间复杂度都比较大
优化
public class SelectionSort {

    public static void selectionSort(int[] a) {
        int n = a.length;
        for (int i = 0; i < n; i++) {
            //定义一个变量来存放数组下角标
            int k = i;
            // 找出最小值的小标
            for (int j = i + 1; j < n; j++) {
                if (a[j] < a[k]) {
                    //确定下角标为k的值最小
                    k = j;
                }
            }
            // 将最小值与我们假定的其实位置数值进行交换
            if (k > i) {
                int tmp = a[i];
                a[i] = a[k];
                a[k] = tmp;
            }
        }
    }
  • 我们只需要将所有的数值比较完最后进行一次交换就可以
  • 节省了时间和空间
小结

先缕清思路,然后写出伪代码,最后根据自己的伪代码与可运行的代码进行比较,循序渐进,提升对算法的理解

评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值