选择排序法

  • A[i...n)未排序,A[0...i)已排序

  • A[i...n]中最小值要放到A[i]的位置

  • 复杂度 \(O(n^2)\)

    第一层循环n次

    第二层循环:i=0,n次;i=1,n-1次......i=n-1,1次。即1+2+3+...+n

    public static void sort(int[] arr) {
    for (int i = 0; i < arr.length; i++) {
    int minIdx = i;
    // 选择A[i...n]中的最小值的索引
    for (int j = i; j < arr.length; j++) {
    if (arr[j] < arr[minIdx])
    minIdx = j;
    }
    swap(arr, i, minIdx);
    }
    } /* 使用带约束的泛型 */
    public static <E extends Comparable<E>> void sort(E[] arr) {
    for (int i = 0; i < arr.length; i++) {
    int minIdx = i;
    for (int j = i; j < arr.length; j++) {
    if (arr[j].compareTo(arr[minIdx]) < 0)
    minIdx = j;
    }
    swap(arr, i, minIdx);
    }
    }

    比较引用类型必须要实现Comparable 接口!

插入排序

  • A[i...n)未排序,A[0...i)已排序

    将arr[i]插入适当的位置

  • 整体复杂度 \(O(n^2)\)

    对于有序数组,插入排序的复杂度是\(O(n)\)

public <E extends Comparable<E>> void insertSort(E[] arr) {
for (int i = 0; i < arr.length; i++) {
// 将arr[i]插入适当的位置
for (int j = i; j-1 >= 0; j--)
if (arr[j].compareTo(arr[j-1]) < 0)
swap(arr, j, j-1);
else break;
}
} /* 小优化 */
public <E extends Comparable<E>> void insertSort2(E[] arr) {
for (int i = 0; i < arr.length; i++) {
int t = arr[i]; // 暂存arr[i]
int j;
for (j = i; j-1>=0 && t.comparaTo(arr[j-1]) < 0) {
arr[j] = arr[j-1]; // 向后移动元素
}
arr[j] = t;
}
}

区别:

选择排序:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。

插入排序:将元素逐个插入到有序排列之中,其特点是要不断的移动数据,空出一个适当的位置,把待插入的元素放到里面去

最新文章

  1. Ext.get Ext.getDom Ext.getCmp 的区别
  2. 11款扁平化设计的 Twitter Bootstrap 主题和模板
  3. Java EE 学习总结
  4. 正则表达式获取字符串中的img标签中的url链接
  5. Hibernate配置问题
  6. python 使用*args 和**kwargs
  7. 远航1617团队alpha版本分数分配与人员调动
  8. C#- 基于Lumisoft.NET组件的POP3邮件接管和删除操纵
  9. replace()、replaceFirst()和replaceAll()的区别
  10. iOS异步图片加载优化与常用开源库分析
  11. HDU 2719 The Seven Percent Solution
  12. JavaScript中的indexOf
  13. CSS基础选择器(选择器的优先级),CSS样式块( 长度/颜色/显示方式/文本样式),盒模型组成,盒模型-block,盒模型布局
  14. JS require and import
  15. github提交代码失败
  16. java十进制转换成二进制数
  17. metamask源码学习-inpage.js
  18. 深入探索AngularJS
  19. 【推荐】Win7任务栏增强工具 7+ Taskbar Tweaker 强大的任务栏标签管理工具
  20. java(9)并发编程

热门文章

  1. 白嫖党的福音!!!全新的Java300集视频(2022版)来了!
  2. 【解决了一个小问题】golang build中因为缓存文件损坏导致的编译错误
  3. 【摘抄】疑问chatterbot
  4. Python实现查询12306火车票信息
  5. python3 类的学习
  6. Redis入门及环境搭建
  7. elasticsearch算法之推荐系统的相似度算法(一)
  8. 题解 - 「MLOI」小兔叽
  9. Android开发-主要的dialog
  10. Redis 源码简洁剖析 05 - ziplist 压缩列表