选择排序

选择排序

因为它在不断地选择剩余元素中的最小值,故称为选择排序
首先找到数组中最小的那个元素,其次将它和数组的第一个元素交换位置。再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。

//选择排序,将a[]按升序排列
public void quickSort(int[] a){
        for (int i = 0; i < a.length; i++) {
            int min = i;    //最小元素的索引
            for (int j = i + 1; j < a.length; j++) {  //注意:是从j=i+1开始,不是j=i!!因为初始时i=min,所以i处无需再比较
                min = (a[j] < a[min]) ? j : min;
            }
            int temp = a[i];
            a[i] = a[min];
            a[min] = temp;
        }
    }


对于长度为N的数组,选择排序需要大约 N2/2 N 2 / 2 次比较和 N N 次交换

每次交换都能排定一个元素,因此交换总次数是N。
0到 N-1 的任意 i 都会进行 1 次交换和 N-1-i 次比较,因此共有 N 次交换以及 (N-1)+(N-2)+…+2+1 = N(N-1)/2 次比较 ~N2/2


选择排序具有两个很鲜明的特点:
1、 运行时间和输入无关。为了找出最小的元素而扫描一遍数组并不能为下一遍扫描提供什么。一个已经有序的数组和一个元素随机排列的数组所用的排序时间竟然一样长!

2、 数据移动是最少的。选择排序用了N次交换——交换次数与数组大小是线性关系。(其他排序算法大多为线性对数或平方级别)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值