选择排序

核心思想

选择排序 ,也是将数组分成两部分,前面部分是有序的,后面部分每趟排序,从i到N-1的部分中
选择出一个最小的元素,然后交换到前面部分的后面。
第一趟排序比较长度是N,因为从N个元素中找出最小的,第二次就是N-1了,….依次递减比较的长度。
所以经过了这几趟排序就可以把数组排序好。
我们选择排序其实就是选择无序中的最小,然后与有序序列的后一个元素交换!

思考步骤

1.首先要有一个比较基准也就是,INFINITY作为初始化,保证数组中的所有元素都比这个数小。
2. 然后我们最外层是0到N-1趟排序,我们趟都是从无序部分找出一个最小的元素。
3. 每一趟排序完,注意都是要把MIN和MinPos设置回初始值,即INFINITY和-1
4. 比较的时候就是不断更新min和MinPos的值。
5. 每一趟最后就是交换A[i]和A[min]

算法实现

public static final int INFINITY=99999;
public void SelectionSort(int[] A){
    if(A==null||A.length<1)
        return;
    int len=A.length;
    for(int i=0;i<len;i++){
        int MIN=INFINITY
        int MinPos=-1;
        for(int k=i;k<len;k++){
            if(A[k]<MIN){
                MIN=A[k];
                MinPos=k;
            }
        }
        //交换注意,一定是交换A[MinPos],MIN只是个判断基准数
        int tmp=A[i];
        A[i]=A[MinPos];
        A[MinPos]=A[i].
    }
}

性能分析

时间复杂度
最好情况: 即便是有序的,还是会比较N个找最小的元素!
最坏情况:O(N^2)
平均: O(N^2)

空间复杂度
O(1)
并没有额外使用数组或其他数据结构。

稳定性
显然是一个不稳定的算法。
因为选择出最小的元素直接与前面有序的后一个元素交换。
比如一个序列 {1,2,7,5,3,5}
–>{1,2,3,5,7,5} ,
此时i所在的数是 左边的第一个5,右边的5是无序部分的,
而无序部分显然找出来的最小元素是5,
那么尽管这两个数是相等的,它们还是要交换!
因为左边的第一个5是有序的后一个元素,而右边的5是无序中的最小元素!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值