算法学习之选择排序(一)

选择排序

  • 找到数组中最小的元素
  • 将它和数组的第一个元素交换位置
  • 在剩下的元素中找到最小的元素, 将它与数组的第二个元素交换位置
  • 如此往复, 直至将数组排序

快速排序算法实现

// 代码块 C-1
public class Selection {
    public static void sort(Comparable[] a) {  
        // 将a[]按升序排列
        int N = a.length; // 数组长度
        for (int i = 0; i < N; i++){  
            // 将a[i]和a[i+1..N]中最小的元素交换
            int min = i; // 最小元素的索引
            for (int j = i+1; j < N; j++){
                // less()函数, (参数1 < 参数2) return true
                if (less(a[j], a[min])) {
                    min = j;
                } 
            } 
            // 对数组a ,交换 索引 i 和 索引min的位置
            exch(a, i, min);
        }
    }
}

分析上述代码块(C-1)

  • 不难看出, 核心算法是两层for循环组成, 我们从内到外分析
    1. 内循环只是在比较当前元素与目前已知的最小元素
    2. 内循环执行完成, 会将比较的最小元素的索引给min
    3. 内循环外面执行exch, 将外循环的索引i和当前的最小索引min进行交换
    4. 也就是说, 外循环执行几次, exch交换函数就执行几次,我们假定为N次
    5. 那么决定算法的时间效率就是内循环每次执行相互比较的次数
    6. 通过查看代码我们发现,每次比较的次数是有规律可循的,第一次是(N-1)次交换, 第二次是(N-2)次交换, 第三次是(N-3)次交换,直至2, 1次
    7. 回头看第四步,一共交换了N次以及(N-1)+(N-2)+…+2+1 = N(N-1)/2 ~ N*N/2次比较
    8. 友情提示: N(N-1)/2 ~ N*N/2 在算法中固定的时间可以忽略掉,算法运行时间随着变量的增减而变化.

选择排序的特点

1. 运行时间和输入无关, 数组长度相等, 运行时间相等,
    不会因为一个数组已经排好顺序而时间减少, 这也是选择排序的缺点.
2. 数据移动是最少的, 交换的次数N和数组的大小是呈线性关系,
     其他算法都不具备这个特征(大部分算法的移动次数都是线性对数或是平方级的)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值