java实现双向选择排序

1.简介

        首先在未排序序列中找到最小(大)元素,存放到排序序列的起始(结束)位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾(前面)。以此类推,直到所有元素均排序完毕。

2.java代码

    public static void main(String[] args) {
        int[] numArray = {6,9,77,3,11,5,2};
        System.out.println(arrayToString(numArray));
        twoSelectSort(numArray);
        System.out.println(arrayToString(numArray));
    }
    
    /**
     * <一句话功能简述> 双向选择排序,每次将未排序的最小、最大元素分别放在最前和最后
     * <功能详细描述> 从第一个元素开始,将第一个元素和最后一个元素默认为最小和最大,遍历
     *   所有元素,找出最小和最大下标,如果最小最大下标不是第一个和最后一个,交换元素(
     *   注意第二次交换时最大值是否已经交换过了);第二次以第二个元素和倒数第二个元素为
     *   剩下的最小和最大,比较的范围为第二个元素至倒数第二个元素,按相同规则遍历比较,
     *   直到最小下标与最大下标相遇结束。
     * author: zhanggw
     * 创建时间:  2022/10/15
     */
    private static void twoSelectSort(int[] numArray){
        if(numArray.length < 2){
            return;
        }

        // 从第一个元素开始
        for(int i=0; i<=numArray.length; i++){
            // 默认第一个元素和最后一个元素为最小、最大值
            int minIndex = i;
            int min = numArray[minIndex];
            int maxIndex = numArray.length -1-i;
            int max = numArray[maxIndex];

            // 最小元素下标与最大元素下标相遇,结束
            if(minIndex >= maxIndex){
                break;
            }
            // 获取第i和length-i之间的最小、最大值
            for(int k=i; k<numArray.length-i; k++){
                if(numArray[k] < min){
                    min = numArray[k];
                    minIndex = k;
                }
                if(numArray[k] > max){
                    max = numArray[k];
                    maxIndex = k;
                }
            }
            // 安放最小、最大值
            if(minIndex != i){
                int tmp = numArray[i];
                numArray[i] = numArray[minIndex];
                numArray[minIndex] = tmp;
            }
            // 注意必须加max == numArray[maxIndex],以防止前面交换数据时改变max的值
            if(max == numArray[maxIndex] && maxIndex != numArray.length -1-i){
                int tmp = numArray[numArray.length -1-i];
                numArray[numArray.length -1-i] = numArray[maxIndex];
                numArray[maxIndex] = tmp;
            }
        }
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kenick

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值