冒泡、选择、插入排序算法

排序大家都很熟了,很古老的算法,古老才有必要回炉再看一遍,经典才值得研究。

1.冒泡排序

从字面意思理解,水泡从水底冒出到水面的过程中,由小慢慢大,最后大泡泡冒出水面,了解这个物理现象就可,整个代码实现的思路也就是这样的。

步骤:
1.比较相邻元素。(若第一个比第二个大,换位)
2.每对相邻元素依次做同样工作,直到最后一对。(一轮结束,最后的元素最大,第一波冒泡完成)
3.对所有元素重复1、2步骤,除了最后一个数。
4.对越来越少的元素重复上面步骤,直到没有一对数字需要比较。

java代码

public class BubbleSort {public static int[] sort(int[] array){//这里for循环表示总共需要比较多少轮for(int i = 1 ; i < array.length; i++){//设定一个标记,若为true,则表示此次循环没有进行交换,也就是待排序列已经有序,排序已经完成。boolean flag = true;//这里for循环表示每轮比较参与的元素下标//对当前无序区间array[0......length-i]进行排序//j的范围很关键,这个范围是在逐步缩小的,因为每轮比较都会将最大的放在右边for(int j = 0 ; j < array.length-i ; j++){if(array[j]>array[j+1]){int temp = array[j];array[j] = array[j+1];array[j+1] = temp;flag = false;}}if(flag){break;}//第 i轮排序的结果为System.out.print("第"+i+"轮排序后的结果为:");display(array);}return array;}//遍历显示数组public static void display(int[] array){for(int i = 0 ; i < array.length ; i++){System.out.print(array[i]+" ");}System.out.println();}public static void main(String[] args) {int[] array = {4,2,8,9,5,7,6,1,3};//未排序数组顺序为System.out.println("未排序数组顺序为:");display(array);System.out.println("-----------------------");array = sort(array);System.out.println("-----------------------");System.out.println("经过冒泡排序后的数组顺序为:");display(array);}}

时间复杂度:
T(n)=O(n2).

2.选择排序

从字面意思理解,先选择需要的数,再将其放置需要的位置。
思路是每一次选择待排序集合中最小的数,将其放置序列起始位置,直到所有待排元素都被排完。

步骤:
1.带排序列中,找到关键字最小元素;
2.若最小元素不是待排序序列的第一个元素,将其和第一个元素互换;
3.余下元素中,找到关键字最小的元素,重复2步骤;
4.重复3步骤,直到排序结束。

Java代码:

public class ChoiceSort {public static int[] sort(int[] array){//总共要经过N-1轮比较for(int i = 0 ; i < array.length-1 ; i++){int min = i;//每轮需要比较的次数for(int j = i+1 ; j < array.length ; j++){if(array[j]<array[min]){min = j;//记录目前能找到的最小值元素的下标}}//将找到的最小值和i位置所在的值进行交换if(i != min){int temp = array[i];array[i] = array[min];array[min] = temp;}//第 i轮排序的结果为System.out.print("第"+(i+1)+"轮排序后的结果为:");display(array);}return array;}//遍历显示数组public static void display(int[] array){for(int i = 0 ; i < array.length ; i++){System.out.print(array[i]+" ");}System.out.println();}public static void main(String[] args){int[] array = {4,2,8,9,5,7,6,1,3};//未排序数组顺序为System.out.println("未排序数组顺序为:");display(array);System.out.println("-----------------------");array = sort(array);System.out.println("-----------------------");System.out.println("经过选择排序后的数组顺序为:");display(array);}
}

时间复杂度:
T(n)=O(n2) (复杂度数量级相同,但是比冒泡要快,当n较小且交换时间比选择时间大的多时,相当快)

3.插入排序

直接插入排序基本思想是每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。
这里介绍最简单的插入排序,其他高级的插入排序后面会题到。

步骤:
1.取出一个待排序元素,根据关键字大小将其放置到有序序列中。
2.再取出一个待排元素,根据关键字大小将其放置到有序序列中。
3.重复步骤2,直到没有待排元素为止。

Java代码

public class InsertSort {public static int[] sort(int[] array){int j;//从下标为1的元素开始选择合适的位置插入,因为下标为0的只有一个元素,默认是有序的for(int i = 1 ; i < array.length ; i++){int tmp = array[i];//记录要插入的数据j = i;while(j > 0 && tmp < array[j-1]){//从已经排序的序列最右边的开始比较,找到比其小的数array[j] = array[j-1];//向后挪动j--;}array[j] = tmp;//存在比其小的数,插入}return array;}//遍历显示数组public static void display(int[] array){for(int i = 0 ; i < array.length ; i++){System.out.print(array[i]+" ");}System.out.println();}public static void main(String[] args){int[] array = {4,2,8,9,5,7,6,1,3};//未排序数组顺序为System.out.println("未排序数组顺序为:");display(array);System.out.println("-----------------------");array = sort(array);System.out.println("-----------------------");System.out.println("经过插入排序后的数组顺序为:");display(array);}}

时间复杂度:
T(n)=O(n2)

总结

经过介绍,对这三种排序会更好的理解,冒泡排序最慢,选择排序将交换次数降到最低,但是比较次数多,当数据量小,并且交换数据相对于比较数据更加耗时的情况下,可以应用选择排序。
在大多数情况下,假设数据量比较小或基本有序时,插入排序是三种算法中最好的选择。

Reference

Java数据结构和算法(三)——冒泡、选择、插入排序算法

回炉篇5—数据结构(4)之冒泡、选择、插入排序算法相关推荐

  1. php三个数字比较大小排序,php中常用的4种实现数字大小排序的冒泡选择等算法函数代码...

    分别用冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中按照从小到大的顺序进行排序. 本站收录这篇文章php中常用的4种实现数字大小排序的冒泡选择等算法函数代码,详细解说文章中相关排序 冒泡 ...

  2. c语言 静态链表插入排序,数据结构C语言版 表插入排序

    西门豹治邺奇计 数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./* 数据结构C语言版 表插入排序 算法10.3 P267-P2 ...

  3. C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划

    C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划 博文末尾支持二维码赞赏哦 _ github 章3 Stack栈 和 队列Queue= ...

  4. c#冒泡、快速、选择和插入排序算法的项目应用

    在之前的一篇文章里,我们简单地实现了对一维数组的四种排序算法,但是在实际的项目中,我们排序的方式可能(几乎是一定)不止仅仅按照数字排序.我们常常按照合适的需要的排序方式进行排序,比如航班信息可能按时间 ...

  5. 如果世界上只有一种数据结构,那么我选择 hash

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"k8s"领取阿里云<深入浅出k8s.pdf> 来源:rrd.me/gEtR ...

  6. python sort 部分元素_Python 简单排序算法-选择、冒泡、插入排序实现

    写文章主要是记录自己每天学习的东西,本篇文章主要介绍数据结构中常用的简单的排序算法,虽然这些算法用Python实现起来不是十分的高效,不如c.java之类的运行速度快,应用Python实现主要是为了: ...

  7. Python数据结构04-冒泡、选择、插入、归并、希尔、快速排序、二分查找

    Python数据结构 各种排序实现 常见排序算法效率比较 搜索 二分法查找 各种排序实现 排序思想不做描述. #冒泡 def bubble_sort(alist):for x in range(0,l ...

  8. 选择排序算法,只需这篇文章就够了

    一.说在前面 一直想写一些简单易懂的文章,因为平时看的很多的书籍或者文章都是看着很难受的感觉,当然,这并不是说书籍写的不好,只是说对于一些没有太多基础或者基础不是很好的来说,相对来说还是比较难以理解的 ...

  9. 冒泡、选择、插入排序算法

    1.冒泡排序: ①.比较相邻的元素.如果第一个比第二个大,就交换他们两个. ②.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.这步做完后,最后的元素会是最大的数(也就是第一波冒泡完成). ...

最新文章

  1. 重构技巧分别能够解决哪些代码味道
  2. 二分查找算法实例注释
  3. Debug docker: docker: Error response from daemon: could not select device driver ““ with capabilitie
  4. C#方式操作Cookie
  5. 文献记录(part28)--A rotation and scale invariant approach for multi-oriented floor plan image ...
  6. 程序员创业的两难困境
  7. 支付业务与技术架构学习总结(8)——支付系统设计包含:账户,对账,风控...
  8. html5自定义组件样式,Taro 自定义组件样式不生效及解决方案
  9. matlab2c使用c++实现matlab函数系列教程-toeplitz函数
  10. android4.4.3版本root,ROOT大师:支持安卓4.3、4.4机型root
  11. Vscode中Latex语法无法出现高亮
  12. 四年级上册数学计算机笔记,读书笔记:最新人教版四年级上册数学总复习讲义...
  13. online judge start_01
  14. 计算机efs加密,win7系统对文件启用EFs加密功能的处理办法
  15. 苹果发布黄色版 iPhone 14,定价 5999 元起;大神李沐被曝离职投身大模型创业;Atlassian 裁员 |极客头条
  16. java 第三方库common系统详解
  17. 汽车行业的互联网生意经
  18. 携程、艺龙、酷讯演绎在线旅游三国志
  19. Java Web应用开发——作业五
  20. 【修真院PM小课】什么是消息推送?

热门文章

  1. 计算机启动灯1212,惠普笔记本电脑型号F6C27PA#AB2wifi开关一直亮红灯开不起怎么办?...
  2. 计算机考研就业率,这8个考研专业,就业率一直居高不下,报了就是赚了!
  3. (附源码)计算机毕业设计SSM基于框架的旅游管理系统
  4. 危与机并存 保险业如何走好线上线下业务并举转型之路?
  5. 项目实战:简易俄罗斯方块(附源码)
  6. python 桑基图_数据可视化之 Sankey 桑基图的实现
  7. 通过微信公众号远程控制设备STM32+NB模组方案
  8. 为什么我劝90%的人不要转行数据分析?数据岗真没你想的那么香
  9. python中frame用法_Python实例之wxpython中Frame使用方法
  10. python bug