排序基础之插入排序、冒泡排序、选择排序详解与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):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为 ...
随机推荐
- sublime text的扩展插件
sublime text用作开发编辑器,还缺省二个比较重要功能:跨文件跳转.返回最后一次编辑的位置: 这里有二个插件正好解决此问题:CTags.ChangeList 其它常用的插件,google一 ...
- osx的du以字节计算
https://stackoverflow.com/questions/5794437/difference-in-size-shown-by-du-command-and-get-info-on-m ...
- LRU和LFU的区别
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/guoweimelon/article/details/50855351 一.概念介绍 LRU和LFU ...
- [转]cocos2d-x
Cocos2d-x 是一个支持多平台的 2D 手机游戏引擎,使用 C++ 开发,基于OpenGL ES,基于Cocos2d-iphone,支持 WOPhone, iOS 4.1, Android 2. ...
- 5句mysql语句
显示表的结构: mysql> DESCRIBE MYTABLE; 往表中加入记录 mysql> insert into MYTABLE values ("hyq",&q ...
- C# Encoding UTF-16 ,C#中的UTF16
http://www.cnblogs.com/criedshy/archive/2012/08/07/2625358.html 前言 众所周知计算机只能识别二进制数字,如1010,1001.我们屏幕所 ...
- HTTPS为什么更安全,先看这些 , 网络加密 , 加密解密
投递人 itwriter 发布于 2017-02-27 21:35 评论(10) 有1957人阅读 原文链接 [收藏] « » HTTPS 是建立在密码学基础之上的一种安全通信协议,严格来说是基于 H ...
- java实时监听日志写入kafka(转)
原文链接:http://www.sjsjw.com/kf_cloud/article/020376ABA013802.asp 目的 实时监听某目录下的日志文件,如有新文件切换到新文件,并同步写入kaf ...
- CF 329C(Graph Reconstruction-随机化求解-random_shuffle(a+1,a+1+n))
C. Graph Reconstruction time limit per test 3 seconds memory limit per test 256 megabytes input stan ...
- C++ 模板学习 函数模板、类模板、迭代器模板
使用模板能够极大到使得代码可重用. 记录一下,方便后续使用. 1. 函数模板,支持多种类型参数 #include <stdio.h> #include <math.h> //函 ...