排序基础之插入排序、冒泡排序、选择排序详解与Java代码实现
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6594533.html
一:插入排序==逐个往前相邻数比较交换,小的在前
第一轮:A[1]与A[0]比较,小的在前面;
第二轮:A[2]~A[0]相邻数比较,小的交换到前面,直到合适位置;
...
第n-1轮:A[n-1]往前比较,小则交换到前面,继续比较交换直到合适位置。
复杂度计算:T=1+2+...(n-1)=(n-1)(n-2)/2=O(n^2)
public int[] insertionSort(int[] A, int n) {
for(int i=0;i<n-1;++i){//i标记有序序列最后位置
for(int j=i+1;j>0;--j){//j为待插入元素
if(A[j]<A[j-1]){//从j开始不断与自己的前面元素比较交换
int temp;
temp=A[j-1];
A[j-1]=A[j];
A[j]=temp;
}
}
}
return A;
}
二:冒泡排序==相邻数比较交换,大者放在后面,每一次把当前轮最大者交换到末尾
排序开始:从0到n-1,进行相邻数比较交换操作,大者放在后面。
第二轮:从0到n-1,进行相邻数比较交换操作,大者放在后面。
......
第n-1轮:比较a[0]和a[1],大者放后面。此时整个数组有序。
复杂度计算:T=n+(n-1)+...+1=n(n-1)/2=O(n^2)
public class BubbleSort {
public int[] bubbleSort(int[] A, int n) {
while(n>=1){//n控制当前是第几轮
for(int i=0;i<n-1;++i){//i负责当前轮的比较交换。注意这里是<n-1。而不是<=n-1。因为下面是i与i+1比较,如果遍历到n-1的话i+1就越界了
if(A[i]>A[i+1]){//比较,交换,让相邻两者大的在后面
int temp;
temp=A[i];
A[i]=A[i+1];
A[i+1]=temp;
}
}
--n;//当前轮结束,缩小范围
}
return A;
}
}
三:选择排序==每次选择待排序列最小者交换到待排序列的最前方
排序开始:从0到n-1遍历,选出最小者,交换到0位置;
第二轮:从1到n-1遍历,选择出最小者,交换到1位置;
...
第n-1轮:从n-2到n-1之间,选择最小者,放到n-2处。此时,0~n-1有序。
复杂度计算:T=n+(n-1)+...+1=n(n-1)/2=O(n^2)
public int[] selectionSort(int[] A, int n) {
for(int i=0;i<=n-1;++i){//当前轮待排序的开始位置
int min=i;//记录待排序列最小值下标
for(int j=i;j<=n-1;++j){
if(A[min]>A[j]){
min=j;//选择最小值下标
}
}
if(min!=i){//如果待排序列开头不是最小值,则交换
int temp;
temp=A[i];
A[i]=A[min];
A[min]=temp;
}
}
return A;
}
(总结:三个O(n^2)的排序算法,插入、冒泡都是相邻元素比较交换达到合适位置的,选择则每次选出最小者交换到开头)
排序基础之插入排序、冒泡排序、选择排序详解与Java代码实现的更多相关文章
- C# 插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序
C# 插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序 以下列出了数据结构与算法的八种基本排序:插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序 ...
- 算法 排序lowB三人组 冒泡排序 选择排序 插入排序
参考博客:基于python的七种经典排序算法 [经典排序算法][集锦] 经典排序算法及python实现 首先明确,算法的实质 是 列表排序.具体就是操作的列表,将无序列表变成有序列表! 一 ...
- 【排序基础】1、选择排序法 - Selection Sort
文章目录 选择排序法 - Selection Sort 为什么要学习O(n^2)的排序算法? 选择排序算法思想 操作:选择排序代码实现 选择排序法 - Selection Sort 简单记录-bobo ...
- 排序算法详解(java代码实现)
排序算法大致分为内部排序和外部排序两种 内部排序:待排序的记录全部放到内存中进行排序,时间复杂度也就等于比较的次数 外部排序:数据量很大,内存无法容纳,需要对外存进行访问再排序,把若干段数据一次读 ...
- 斐波那契堆(Fibonacci heap)原理详解(附java代码实现)
前言 斐波那契堆(Fibonacci heap)是计算机科学中最小堆有序树的集合.它和二项式堆有类似的性质,但比二项式堆有更好的均摊时间.堆的名字来源于斐波那契数,它常用于分析运行时间. 堆结构介绍 ...
- JavaScript 数据结构与算法之美 - 冒泡排序、插入排序、选择排序
1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算 ...
- 学习C#之旅 冒泡排序,选择排序,插入排序,希尔排序[资料收集]
关于冒泡排序,选择排序,插入排序,希尔排序[资料收集] 以下资料来源与网络 冒泡排序:从后到前(或者从前到后)相邻的两个两两进行比较,不满足要求就位置进行交换,一轮下来选择出一个最小(或最大)的放到 ...
- Python实现八大排序(基数排序、归并排序、堆排序、简单选择排序、直接插入排序、希尔排序、快速排序、冒泡排序)
目录 八大排序 基数排序 归并排序 堆排序 简单选择排序 直接插入排序 希尔排序 快速排序 冒泡排序 时间测试 八大排序 大概了解了一下八大排序,发现排序方法的难易程度相差很多,相应的,他们计算同一列 ...
- python算法(一)基本知识&冒泡排序&选择排序&插入排序
本节内容: 算法基本知识 冒泡排序 选择排序 插入排序 1. 算法基本知识 1.1 什么是算法? 算法(algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为 ...
随机推荐
- Nvidia驱动正确安装过程
找到适合的正确的驱动 去nvidia驱动官网下载 卸载掉原有驱动 sudo apt-get remove –purge nvidia* 安装驱动 进入命令行界面 Ctrl-Alt+F1 给驱动run文 ...
- Java 文件路径相关
不得不说Java的文件路径弄得很复杂, 有编译目录和resource目录什么的和解释型语言(PHP)的就是不一样 搞了好几年java一直没认真去研究这些个破路径怎么回事, 每次都忘记, 梳理一下备忘 ...
- 【BZOJ】【3673】可持久化并查集 & 【3674】可持久化并查集加强版
可持久化并查集 Orz hzwer & zyf 呃学习了一下可持久化并查集的姿势……其实并查集就是一个fa数组(可能还要带一个size或rank数组),那么我们对并查集可持久化其实就是实现一个 ...
- maven打包加时间戳
基于Maven的项目,发布时需要打包,如tar.gz.web项目打成war格式包.每次打包时希望自己加上时间戳,假如我的项目名是myproject,默认打包后名为myproject.war.而我希望的 ...
- C#高级编程六十六天----表达式树总结【转】
https://blog.csdn.net/shanyongxu/article/details/47257139 表达式树总结 基础 表达式树提供了一个将可执行代码转换成数据的方法.如果你要在执行代 ...
- maskrcnn_benchmark代码分析(2)
maskrcnn_benchmark训练过程 ->训练命令: python tools/train_net.py --config-file "configs/e2e_mask_rcn ...
- 使用Vue.js实现列表选中效果
实际项目中,我们会遇到很多类似的需求,一个列表,需要点击其中一条高亮显示.熟悉JQuery的同学说这个太简单了.可以给这个选中的element设置一个active的class.配合Css样式,让ac ...
- VS调试快捷键
VS调试快捷键 命令名 快捷键 说明 调试.应用代码更改 Alt + F10 启动生成操作,利用它可以通过“编辑并继续”功能应用对正在调试的代码所作的更改. 调试.自动窗口 Ctrl + D,Ct ...
- Windows10 安装Jupyter
官方文档:https://jupyter-notebook.readthedocs.io/en/stable/ https://github.com/jupyter/jupyter/wiki/A-ga ...
- rqnoj-329-刘翔!加油!-二维背包
注意排除干扰项. 因为价值不会相等,所以价值的多少与本题没有任何关系,. 所以价值为干扰项,所以不用考虑. 二维背包,简单求解. #include<stdio.h> #include< ...