排序基础之插入排序、冒泡排序、选择排序详解与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):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为 ...
随机推荐
- fastjson转换对象,属性首字母大小写的问题
请求Json数据的时候,传递过去的String类型转Json数据的时候经常有首字母是大写的情况,例如"LoginAccount":"02:00:00:62:73:74&q ...
- 神奇女侠Wonder Woman迅雷下载
亚马逊公主戴安娜·普林斯(盖尔·加朵 Gal Gadot 饰),经过在家乡天堂岛的训练,取得上帝赐予的武器 与装备,化身神奇女侠,与空军上尉史蒂夫·特雷弗(克里斯·派恩 Chris Pine 饰)一同 ...
- Oracle初级索引学习总结
前言 索引是常见的数据库对象,建立索引的目的是为了提高记录的检索速度.它的设置好坏,使用是否得当,极大地影响数据库应用程序和Database的性能.虽然有许多资料讲索引的用法,DBA和Develop ...
- sublime text的扩展插件
sublime text用作开发编辑器,还缺省二个比较重要功能:跨文件跳转.返回最后一次编辑的位置: 这里有二个插件正好解决此问题:CTags.ChangeList 其它常用的插件,google一 ...
- Android之TextView部分颜色变动
public class StringHandleExampleActivity extends Activity { /** Called when the activity is first cr ...
- BZOJ 3172 [Tjoi2013]单词 AC自己主动机(fail树)
题意:链接 方法:AC自己主动机与fail树性质 解析:复习AC自己主动机的第一道题?(真正的第一题明明是又一次写了遍hdu2222! ) 这题说实话第一眼看上去就是个sb题,仅仅要建出来自己主动机. ...
- Android:客户端和服务器之间传输数据加密
Android客户端与服务器进行数据传输时,一般会涉及到两类数据的加密情况,一类是只有创建者才能知道的数据,比如密码:另一类是其他比较重要的,但是可以逆向解密的数据. 第一类:密码类的数据,为了让用户 ...
- Java获取当前时间30天之前的时间
//方法一 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String maxDateStr = " ...
- Gradle 简介
一.简介 Gradle 是 Android 现在主流的编译工具,虽然在Gradle 出现之前和之后都有对应更快的编译工具出现,但是 Gradle 的优势就在于它是亲儿子,Gradle 确实比较慢,这和 ...
- 使用ASP.NET AJAX与Bootstrap 弹窗解决方案
我在做采购系统时,因为使用了ASP.NET AJAX的UpdatePanel的控件,可以使得页面局部刷新显示.但是使用起来问题还是很多. 下面列出了一种情况,花了将近5个小时才算解决,虽然不是很完美, ...