📚 选择排序和插入排序区别-DS笔记
选择排序法
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;
}
}
区别:
选择排序:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
插入排序:将元素逐个插入到有序排列之中,其特点是要不断的移动数据,空出一个适当的位置,把待插入的元素放到里面去
📚 选择排序和插入排序区别-DS笔记的更多相关文章
- JavaScript算法(冒泡排序、选择排序与插入排序)
冒泡排序.选择排序与插入排序复杂度都是二次方级别的,放在一起说吧. 介绍一些学习这三个排序方法的比较好的资料.冒泡排序看<学习JavaScript数据结构与算法>介绍的冒泡排序,选择排序看 ...
- Java数据结构和算法总结-冒泡排序、选择排序、插入排序算法分析
前言:排序在算法中的地位自然不必多说,在许多工作中都用到了排序,就像学生成绩统计名次.商城商品销量排名.新闻的搜索热度排名等等.也正因为排序的应用范围如此之广,引起了许多人深入研究它的兴趣,直至今天, ...
- Java排序算法分析与实现:快排、冒泡排序、选择排序、插入排序、归并排序(二)
一.概述: 上篇博客介绍了常见简单算法:冒泡排序.选择排序和插入排序.本文介绍高级排序算法:快速排序和归并排序.在开始介绍算法之前,首先介绍高级算法所需要的基础知识:划分.递归,并顺带介绍二分查找算法 ...
- Java选择排序,插入排序,快速排序
public class Test { public static void main(String[] args) { int a[] = { 1, 2, 3, 4, 5 }; 选择排序(a); ...
- 【程序员笔试面试必会——排序①】Python实现 冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、希尔排序
最近在准备笔试题和面试题,把学到的东西整理出来,一来是给自己留个笔记,二来是帮助大家学习. 题目: 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: 输入:[1,2,3,5,2, ...
- [PHP]基本排序(冒泡排序、快速排序、选择排序、插入排序、二分法排序)
冒泡排序: function bubbleSort($array){ $len=count($array); //该层循环控制 需要冒泡的轮数 for($i=1;$i<$len;$i++){ / ...
- php 实现冒泡算法排序、快速排序、选择排序,插入排序
许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一个初级phper,虽然很少接触到算法方面的东西 .但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算法,我想还是要 ...
- 必须知道的八大种排序算法【java实现】(二) 选择排序,插入排序,希尔算法【详解】
一.选择排序 1.基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换:然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止. 2.实例 3.算法 ...
- 八大排序方法汇总(选择排序,插入排序-简单插入排序、shell排序,交换排序-冒泡排序、快速排序、堆排序,归并排序,计数排序)
2013-08-22 14:55:33 八大排序方法汇总(选择排序-简单选择排序.堆排序,插入排序-简单插入排序.shell排序,交换排序-冒泡排序.快速排序,归并排序,计数排序). 插入排序还可以和 ...
随机推荐
- UML 有关用例图知识及用例关系
原文链接:https://blog.csdn.net/mj_ww/article/details/53020080 1. 如何识别用例 任何用例都不能在缺少参与者的情况下独立存在.同样,任何参与者也必 ...
- 【刷题-LeetCode】201 Bitwise AND of Numbers Range
Bitwise AND of Numbers Range Given a range [m, n] where 0 <= m <= n <= 2147483647, return t ...
- 1000粉!使用Three.js制作一个专属3D奖牌🥇
背景 破防了 !突然发现 SegmentFault 平台的粉丝数量已经突破 1000 了,它是我的三个博客平台掘金.博客园.SegmentFault中首个粉丝突破 1000 的,于是设计开发这个页面, ...
- AOP-操作术语
AOP(术语) 1,连接点 类里面哪些方法可以被增强,这些方法称为连接点 2,切入点 实际被真正增强的方法,称为切入点 3,通知(增强) (1)实际增强的逻辑部分称为通知(增强) (2)通知有多种类型 ...
- 聊一聊如何用C#轻松完成一个SAGA分布式事务
背景 银行跨行转账业务是一个典型分布式事务场景,假设 A 需要跨行转账给 B,那么就涉及两个银行的数据,无法通过一个数据库的本地事务保证转账的 ACID ,只能够通过分布式事务来解决. 市面上使用比较 ...
- while...break 实例
// 输出1-100内前5个可以被3整除的数 public class Demo { public static void main(String[] args) { int num = 0; for ...
- 『无为则无心』Python函数 — 40、Python自定义异常
目录 1.使用 raise 语句来抛出异常 (1)抛出异常类 (2)抛出异常类的实例 2.自定义异常类 (1)简单实现 (2)完整实现 在Python中,抛出自定义异常的语法为 raise 异常类对象 ...
- QPS、TPS、并发用户数、吞吐量
1.QPS QPS Queries Per Second 是每秒查询率 ,是一台服务器 每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内 所处理流量多少的衡量标准, 即每秒的响应请求数,也 ...
- How to find out which process is listening upon a port
When we covered port scanning a short while ago we discovered how to tell which ports had processes ...
- Android安卓开发-记账本布局
账单页面布局统计页面布局我的页面布局主页面加号记账页面布局.点击记账页面记账类别布局点击收入页面收入类别布局统计页面支出布局统计页面收入布局查询页面布局数据库设计字段一,支出id和收入id分配字段二, ...