排序是数据处理中十分常见且核心的操作,虽说实际项目开发中很小几率会需要我们手动实现,毕竟每种语言的类库中都有n多种关于排序算法的实现。但是了解这些精妙的思想对我们还是大有裨益的。本文简单温习下最基础的三类算法:选择,冒泡,插入。

  先定义个交换数组元素的函数,供排序时调用

   /*** 交换数组元素* @param arr* @param a* @param b*/public static void swap(int []arr,int a,int b){arr[a] = arr[a]+arr[b];arr[b] = arr[a]-arr[b];arr[a] = arr[a]-arr[b];}

简单选择排序

  简单选择排序是最简单直观的一种算法,基本思想为每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止,简单选择排序是不稳定排序。

  在算法实现时,每一趟确定最小元素的时候会通过不断地比较交换来使得首位置为当前最小,交换是个比较耗时的操作。其实我们很容易发现,在还未完全确定当前最小元素之前,这些交换都是无意义的。我们可以通过设置一个变量min,每一次比较仅存储较小元素的数组下标,当轮循环结束之后,那这个变量存储的就是当前最小元素的下标,此时再执行交换操作即可。代码实现很简单,一起来看下。

  代码实现

    /*** 简单选择排序** @param arr*/public static void selectSort(int[] arr) {for (int i = 0; i < arr.length - 1; i++) {int min = i;//每一趟循环比较时,min用于存放较小元素的数组下标,这样当前批次比较完毕最终存放的就是此趟内最小的元素的下标,避免每次遇到较小元素都要进行交换。for (int j = i + 1; j < arr.length; j++) {if (arr[j] < arr[min]) {min = j;}}//进行交换,如果min发生变化,则进行交换if (min != i) {swap(arr,min,i);}}} 

  简单选择排序通过上面优化之后,无论数组原始排列如何,比较次数是不变的;对于交换操作,在最好情况下也就是数组完全有序的时候,无需任何交换移动,在最差情况下,也就是数组倒序的时候,交换次数为n-1次。综合下来,时间复杂度为O(n2)

冒泡排序

  冒泡排序的基本思想是,对相邻的元素进行两两比较,顺序相反则进行交换,这样,每一趟会将最小或最大的元素“浮”到顶端,最终达到完全有序

  

  代码实现

    在冒泡排序的过程中,如果某一趟执行完毕,没有做任何一次交换操作,比如数组[5,4,1,2,3],执行了两次冒泡,也就是两次外循环之后,分别将5和4调整到最终位置[1,2,3,4,5]。此时,再执行第三次循环后,一次交换都没有做,这就说明剩下的序列已经是有序的,排序操作也就可以完成了,来看下代码 

 /*** 冒泡排序** @param arr*/public static void bubbleSort(int[] arr) {for (int i = 0; i < arr.length - 1; i++) {boolean flag = true;//设定一个标记,若为true,则表示此次循环没有进行交换,也就是待排序列已经有序,排序已然完成。for (int j = 0; j < arr.length - 1 - i; j++) {if (arr[j] > arr[j + 1]) {swap(arr,j,j+1);flag = false;}}if (flag) {break;}}}

  根据上面这种冒泡实现,若原数组本身就是有序的(这是最好情况),仅需n-1次比较就可完成;若是倒序,比较次数为 n-1+n-2+...+1=n(n-1)/2,交换次数和比较次数等值。所以,其时间复杂度依然为O(n2)。综合来看,冒泡排序性能还还是稍差于上面那种选择排序的。

直接插入排序

  直接插入排序基本思想是每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。

  

代码实现 

    /*** 插入排序** @param arr*/public static void insertionSort(int[] arr) {for (int i = 1; i < arr.length; i++) {int j = i;while (j > 0 && arr[j] < arr[j - 1]) {swap(arr,j,j-1);j--;}}}

  简单插入排序在最好情况下,需要比较n-1次,无需交换元素,时间复杂度为O(n);在最坏情况下,时间复杂度依然为O(n2)。但是在数组元素随机排列的情况下,插入排序还是要优于上面两种排序的。

总结

  本文列举了排序算法中最基本的三种算法(简单选择,冒泡,插入),这三种排序算法的时间复杂度均为O(n2),后续会陆续更新其他更高阶一些的排序算法,时间复杂度也会逐步突破O(n2),谢谢支持。

Copyright ©2018 dreamcatcher-cx

转载于:https://www.cnblogs.com/yifeichongtian/p/10082859.html

图解排序算法之3种简单排序(选择,冒泡,直接插入)相关推荐

  1. 算法:三种简单排序算法

    排序算法比較常见的有:冒泡排序.简单选择排序.直接插入排序:希尔排序.堆排序.归并排序和高速排序算法等. 今天先学习一下前面三种比較简单的算法.排序的相关概念: ①排序的稳定性:两个或多个元素相等.排 ...

  2. php 各种排序算法,PHP四种常见排序算法

    一.冒泡排序: 冒泡排序可以说是最常见,也是最简单,最经典的排序算法了. 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换 ...

  3. 对以下6种常用的内部排序算法进行比较:起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序。

    题目要求: (1)对以下6种常用的内部排序算法进行比较:起泡排序.直接插入排序.简单选择排序.快速排序.希尔排序.堆排序. (2)待排序表的表长不小于100:其中的数据要用伪随机数产生程序产生:至少要 ...

  4. 【排序算法】冒泡排序、简单选择排序、直接插入排序比较和分析

    [排序算法]冒泡排序.简单选择排序.直接插入排序比较和分析 写在前面: 本文简单介绍了冒泡排序.简单选择排序.直接插入排序,并对这三种排序进行比较,入参都是80000个随机数,比较算法耗时.进一步,我 ...

  5. 数据结构与算法XS班-左程云第一节课笔记(位运算、算法是什么、简单排序)

    第1节 位运算.算法是什么.简单排序 ##这是数据结构与算法新手班-左程云第一节课的笔记## 1. 位运算 // 你们会不会表示一个数字的32位啊? // Java中int类型默认以32位二进制数在计 ...

  6. 一学就废的三种简单排序【冒泡、插入、选择】

    文章目录 其他排序算法 冒泡排序 算法实现 代码实例 插入排序 算法实现 代码实例 选择排序 算法实现 代码实例 其他排序算法 一学就废的归并排序 冒泡排序 排列顺序从前到后或者从后往前都可,本文选择 ...

  7. 排序算法:冒泡排序、插入排序、选择排序、希尔排序

    相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 一.冒泡排序: 1.算法原理: 冒 ...

  8. 十大经典排序算法python_十大经典排序算法的算法描述和代码实现

    这里详细讲解了十大经典算法的分类,例如交换排序.插入排序.选择排序等比较类排序,以及计数排序.桶排序和基数排序的非比较类排序,分析了各种排序算法的复杂度和稳定性,还有JAVA代码的详细实现.对冒泡排序 ...

  9. 排序算法--(冒泡排序,插入排序,选择排序,归并排序,快速排序,桶排序,计数排序,基数排序)

    一.时间复杂度分析 - **时间复杂度**:对排序数据的总的操作次数.反应当n变化时,操作次数呈现什么规律 - **空间复杂度**:算法在计算机内执行时所需要的存储空间的容量,它也是数据规模n的函数. ...

最新文章

  1. vs打开php项目路径,如何让vscode右键项目文件夹打开
  2. Google Gears 指南
  3. kylin如何支持flink_Kylin 在腾讯的平台化及 Flink 引擎实践
  4. c++ set 遍历_47. Set 是如何工作的(3) 遍历顺序是如何确定的?
  5. linux相关英文书记,Linux常用软件(英文介绍)
  6. memlock mysql_mysql配置详解(不断更新)
  7. 蓝桥杯基础练习1-15(python)
  8. 微服务 注册中心的作用_SpringCloud(二)服务注册中心与Eureka工作原理介绍
  9. 文件管理系统源码_【程序源代码】人力资源管理系统
  10. CS224N笔记——RNN和语言模型
  11. Nginx-搭建https服务器
  12. 流形学习t-SNE,LLE,Isomap
  13. echars中国地图,省份名字居中
  14. 显示当前系统时间和日期
  15. MongoDB客户端命令总结
  16. 一元稀疏多项式计算器
  17. 抖音做外卖会颠覆美团吗?
  18. C语言汇总学生成绩,c语言用二维数组统计学生成绩.doc
  19. Tbase基础积累二之数据迁移工具dbbridge
  20. 雅虎口碑将关闭站长天下服务平台

热门文章

  1. SpringMVC必备的jar包
  2. 阻塞队列BlockingQueue 学习
  3. 取一个字符串中的数字
  4. Sql Server导出表结构Excel
  5. C# MVC中返回JSON 对象
  6. java设计模式之为别人做嫁衣----代理模式
  7. Ubuntu10.10源
  8. 手机验证码倒记时函数
  9. rhel6ACL权限
  10. 招聘带来的Silverlight团队技能指标