选择排序

选择排序是一种最简单的排序方式,主要的思想:

首先,找到数组中最小的那个数及其下标,将最小的这个数与数组第一个数交换位置,那么这个最小的数就在数组的第一个位置了,然后从数组第二个位置开始寻找最小的数,找到后与数组的第二个位置的数进行交换,如果没找到,就自己交换自己。反复下去,就得到了排序的数组。这种方法就叫选择排序,因为它总是在不选的选择剩余元素的最小值。

案例图示:

代码

    public static void select(int[] a)
    {
        for (int i=0;i<a.length;i++)
        {
            int temp=a[i];//将未排序的第一个元素存到temp
            int k=i;//将未排序的第一个元素的下标保存到k
            int p;//作为两个元素交换的过渡值
            for (int j=i+1;j<a.length;j++)
            {

                if(temp<a[j])//找出未排序元素的最小值和下标
                {
                    temp=a[j];
                    k=j;
                }

            }
            //如果未排序的第一个元素本身就是最小值了,那么此时的i与k就是相等的,相当于自身交换
            p=a[i];
            a[i]=temp;
            a[k]=p;
        }
    }

两个特点

1.运行时间与输入无关,因为不论是乱序数组还是已经有序的数组,它都会进行比较和交换。

2.数据移动是最少的,每次交换都会改变两个数组元素的值,因此如果数组大小是N的话,就交换了N次,因此交换次数与数组大小成线性关系

时间复杂度分析:

为了确定数组第一个位置的元素,需要比较N-1次,确定数组第二个位置的元素,需要比较N-2次,以此类推,总共需要比较(N-1)+(N-2)+......+2+1=N*(N-1)/2,所以时间复杂度为O(N^2)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值