Java排序算法之选择排序

一、什么是选择排序

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。

二、算法实现

1、初始状态:无序区为R[0,…,n-1](共n个元素),有序区为空。
2、第1趟排序
设置一个变量i,让i从0至n-2循环的同时,对比数组中元素i跟元素i+1的大小,如果R[i+1]比R[i]小,则用一个变量k来记住他的位置(即k=i+1)。等到循环结束的时候,我们应该找到了R中最小的那个数的位置了。然后进行判断,如果这个最小元素的不是R的第一个元素,就让第一个元素跟他交换一下值,使R[0]和R[1,…,n-1]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
3、第i趟排序
第i趟排序开始时,当前有序区和无序区分别为R[0,…,i-1]和R[i,…,n-1]。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[0,…,i]和R[i+1,…,n-1]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
在这里插入图片描述

编程实现

时间复杂度为O(n^2),空间复杂度为O(1)
选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。举个例子,序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中两个5的相对前后顺序就被破坏了,所以选择排序是一个不稳定的排序算法

//该编程实现为优化后的编程实现
 public static void optimizedSelectSort(int[] array){
        if(array == null || array.length == 0){
            return;
        }
        for(int i=0; i<array.length/2; i++){
            //表示待排序列第一个值
            int minIndex = i;
            int maxIndex = i;
            for(int j=i+1; j<=array.length-1-i; j++){
                if(array[j] < array[minIndex]){
                    minIndex = j;//minIndex保存元素的最小下标
                    continue;
                }
                if(array[j] > array[maxIndex]){
                    maxIndex = j;//maxIndex保存元素的最大下标
                }
            }

            //minIndex指向的最小值与第一个值进行交换
            int tmp = array[minIndex];
            array[minIndex] = array[i];
            array[i] = tmp;

            //如果最大的元素下标是i,上一步交换了min和i的值,
            //max应该是min的下标
            if(maxIndex == i){
                maxIndex = minIndex;
            }

            //maxIndex指向的最大值与最后一个值进行交换
            tmp = array[maxIndex];
            array[maxIndex] = array[array.length-1-i];
            array[array.length-1-i] = tmp;
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值