Java中的选择排序

选择排序


上一篇博客我们说了关系比较密切的插入排序和希尔排序,这篇博客我们来盘一盘选择排序.
选择排序的思想很简单,从所有数据中选一个最小的放在第一个,然后从第二个数据开始选出最小的那个放到第二个以此类推:

    private void swap(int[]arr,int i,int j){
        int tmp=arr[i];
        arr[i]=arr[j];
        arr[j]=tmp;
    }

    public void selectSort(int[]arr){
        for (int i = 0; i < arr.length; i++) {
            int minIndex=i;
            for (int j = i+1; j < arr.length; j++) {
                if(arr[j]<arr[minIndex]){
                    minIndex=j;
                }
            }
            swap(arr,i,minIndex);
        }
    }

我们可以明显感觉到,选择排序是一遍又一遍遍历了数组,经过简单地思考我们发现不管数据是否有序选择排序都是要遍历完的,其实我们还可以双管齐下,一边找最大一边找最小:

    public void selectSort2(int[] arr){
        int left=0;
        int right=arr.length-1;
        for(int i=0;i<arr.length;i++){
            int minIndex=i;
            int maxIndex=i;
            for(int j=i+1;j<arr.length-i;j++){
                if(arr[j]<arr[minIndex]){
                    minIndex=j;
                }
                if(arr[j]>arr[maxIndex]){
                    maxIndex=j;
                }
            }
            //如果最大的正好是第一个,按照我们刚才的分析,是要把最小的放在
            //第一个的,这样子我们就找不到最大值了,所以要提前准备
            if(maxIndex==left){
                maxIndex=minIndex;
            }
            swap(arr,minIndex,left);
            swap(arr,maxIndex,right);
            left++;
            right--;
            不能越界
            if(left>right){
                break;
            }
        }
    }

使用双管齐下方法呢,代码变长了,不出意外的话运算时间应该会短一些,但是就时间复杂度来看,并没有任何改变.
希望我的这篇博客可以帮助到兄弟们.
百年大道,你我共勉!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值