冒泡排序

核心思想:冒泡排序只会比较相邻的两个数,相邻的两个数满足大小条件时不移动,不满足大小条件时交换位置,然后指针后移一位,直到指针到达未排序的序列的倒数第二个位置,再进行下一轮排序。冒泡排序每一轮至少会使一个数到达指定的位置。

以C,D,A,F,B,E为例,下面图解为从小到大排序,且只展示了F回到自己位置,后面的数据思想相同。

第一轮结束后,F回到了自己的位置。

时间复杂度:每一次循环都有至少一个数字回到自己的位置上,那么循环数组长度那么多次就会使所有的数字回到自己的位置,因此时间复杂度为O(n^2),但冒泡排序还可以进行优化。如下图所示,实际在第三轮已经将所有的数字排序完成,第四、五、六次是不必要的操作,因为我们可以加一个标志位,当一轮中没有任何数字交换,说明已经全部排序成功,提前跳出循环,祥见代码。

所以优化后的冒泡排序的时间复杂度可以准确描述为,最好情况下,只需经过一个冒泡,时间复杂度为O(n),最坏情况下,需要n次冒泡,时间复杂度为O(n2)。平均情况下的时间复杂度也为O(n2)

空间复杂度:O(1),像这种空间复杂度为O(1)的排序算法也称为原地排序,即没有借助多余的内存空间。

Java实现

 /***@author 苞谷洁子*@param arr 待排序的数组 */public static int[] sort(int[] arr){if(arr == null){return null;}if(arr.length == 1 || arr.length == 0){return arr;}boolean flag;for(int i = 0;i<arr.length;i++){flag = true;//从后往前排序的,下标为arr.length-i的已经排好序了for(int j = 0;j<arr.length-i-1;j++){//当前一个数字比后一个数字大,就将相邻的两个数字交换if(arr[j]>arr[j+1]){int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;flag = false;}}//flag标志记录当前次是否进行的修改,为true表示已经排序完成了,可以直接返回了if(flag){break;}}return arr;}

插入排序

核心思想:插入排序是从数组的插入演变而来的,其主要思想是将数组分为两个区域,一个是已经排序的区域,一个是未排序的区域。每一轮都是将未排序的第一个数字与排序的数字从后往前比较,边比较边将比较过的数字后移,直到找到插入的位置,将其插入。每一轮有且只有一个数字回到自己的位置,如下图所示。


时间复杂度:插入排序也分最好情况和最坏情况,在最好的情况下,数组完全为有序的,因此在无序序列第一个数字和有序序列最后数字比较时,可以直接得到要插入的位置就是当前位置,所以只需要n次操作,就能完成排序,时间复杂度为O(n);最坏情况下数组是完全逆序的,因此每一轮都要将前i个数字后移才能挪出插入的位置,时间复杂度为O(n2),平均时间复杂度为O(n2)。

空间复杂度:插入排序也是一个原地排序,没有使用多余的内存空间,空间复杂度为O(1)

Java实现:

 /*** @author 苞谷洁子* @param arr 待排序的数据*/public static int[] sort(int[] arr){if(arr == null){return null;}if(arr.length == 1 || arr.length == 0){return arr;}for(int i = 0;i<arr.length;i++){int temp = arr[i];int j = i-1;for(;j>=0;j--){if(temp < arr[j]){arr[j+1] = arr[j];}else{break;}}arr[j+1] = temp;}return arr;}

选择排序

核心思想:选择排序也是将数组分为两个区域,已排序和未排序区域。它是从未排序数组中,按照要排序的大小顺序(如从大到小排序),选择出最小的数字,和未排序的第一个数字交换位置,并为已排序的数组中,依次这样,直到整个数组排序完成。如下图所示:

时间复杂度:选择排序部分最好情况和最坏情况,因为即使数组是有序的,但是每一轮仍要遍历无序的部分找出最小的数字,因此选择排序的时间复杂度为O(n^2)。

空间复杂度:选择排序也是一个原地排序算法,空间复杂度为O(1)。

Java实现:

 /***@author 苞谷洁子* @param arr 待排序的数组*/public static int[] sort(int[] arr){if(arr == null){return null;}if(arr.length == 1 || arr.length == 0){return arr;}for(int i = 0;i<arr.length-1;i++){int min = arr[i];int n = i;for(int j = i;j<arr.length;j++){//选择出最小的数if(arr[j]<min){min = arr[j];n = j;}}if(n != i){int temp = arr[i];arr[i] = arr[n];arr[n] = temp;}}return arr;}

数据结构最常用的排序算法一(冒泡、插入、选择)-Java实现相关推荐

  1. php递归算法排序,php常用的排序算法代码[冒泡,递归排序-PHP源码

    <script>ec(2);<script> php 常用的排序算法代码[冒泡,递归排序 冒泡排序算法 function bubblesort($arr) { $n=count ...

  2. C++实现十大排序算法(冒泡,选择,插入,归并,快速,堆,希尔,桶,计数,基数)排序算法时间复杂度、空间复杂度、稳定性比较(面试经验总结)

    排序算法分类 内部排序算法又分为基于比较的排序算法和不基于比较的排序算法,其分类如下: 比较排序:   直接插入排序    希尔排序 (插入)  冒泡排序     快速排序  (交换) 直接选择排序  ...

  3. 排序算法之冒泡,选择,插入

    冒泡排序为一种稳定的排序算法,时间复杂度为O(n2),空间复杂度为O(1) 选择排序在冒泡排序的基础上做了改进,但为一种不稳定的排序算法,时间复杂度为O(n2),空间复杂度为O(1) 插入排序时间复杂 ...

  4. 5中排序算法(冒泡,选择,插入,快速,归并)

    1冒泡排序 比较相邻的元素,将小的放到前面,(每一轮找出数组中最大的放在后面,后面排好序的数组元素不参与下轮排序). 下面将数组[7,8,5,1,3]里面的元素进行排序. 7 8 5 1 3 1.1: ...

  5. java冒泡遍历对象_Java经典排序算法(冒泡、选择、插入)

    排序算法说明 排序说明 对一序列对象根据某个关键字进行排序. 术语说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面: 不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b ...

  6. 排序算法汇总--冒泡,插入,归并,快速,堆,计数,基数,桶排序

    sort.cpp #include "stdafx.h" #include <stdlib.h>#define swap(x,y,t) t = x, x = y, y ...

  7. 面试常被问到排序算法总结(插入+选择+交换+归并排序)

    排序算法总结 谈及排序算法,大家知道常见的排序算法都有哪些呢? 下面来总结一下常见的排序算法: 插入排序 基本思想: 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记 ...

  8. 排序算法整理(冒泡、选择、快排、堆排序、希尔、归并)

    文章目录 前言 插入排序 希尔排序 关键代码如下 归并排序 快速排序 堆排序 前言 大四了开始学了,希望为时不晚,呜呜. 总结数据结构的相关知识,代码会用java实现 其他相关部分: 2-3树.平衡树 ...

  9. 算法之排序算法(冒泡法和选择法)

    本篇文章中,都以十个数排序为例子讲解. 冒泡法是依次从后面确定,而选择法则是依次从前面确定.也就是说,冒泡法先确定最后一个数,再确定倒数第二个,再确定--:选择法先确定第一个数,再确定第二个数,再确定 ...

最新文章

  1. 高精度加法(C++实现)
  2. centos FTP服务器的架设和配置
  3. boost::hana::erase_key用法的测试程序
  4. 输入文字自动生成图片_批量生成变化的图片文字海报
  5. jquery ready方法实现原理
  6. python正则匹配ip地址_python 正则表达式匹配IP地址
  7. 微信视频不能连接到服务器,微信无法连接到服务器
  8. 面试中软性问题的套路与反套路
  9. 计算机中DW用户名和域名,如何获取线程关联用户名和域名
  10. repeat mysql翻译_MySQL数据库中系统函数repeat有哪些功能呢?
  11. ENVI入门系列教程---一、数据预处理---3.1 基于自带定位信息的几何校正
  12. 即时通讯WebSocket
  13. 【笔记】TNT: Target-driveN Trajectory Prediction
  14. 支付宝怎么看银行卡号?支付宝查询银行卡号仅需3步
  15. B. MADMAX(记搜+博弈)
  16. Symbol Type Viewer Version 1.0.0.3 (beta) by Lionel d'Hauenens
  17. 计算机建模与仿真心得,数学建模学习心得
  18. ps-黑白老照片快速上色
  19. 乘法计算机公式,在word中乘法的函数公式计算公式
  20. linux如何连接redis

热门文章

  1. 后棱镜时代的个人信息黑洞,电影《绝对控制》在现实中存在吗?
  2. Cookie.js 源码解析
  3. STM32使用FreeRTOS CLI
  4. matlab的setup阶跃曲线图,matlab 绘制系统的单位阶跃响应曲线 并编写程序求峰值时间 超调量 | 学步园...
  5. 开源项目——小Q聊天机器人V1.2
  6. MySQL更新时间的时候生成随机时间
  7. java 分布式缓存 开源_Java开源分布式键-值缓存系统Voldemort
  8. java pptx,使用Java将文件.pptx转换为.ppt
  9. 北京交通大学c语言程序设计,北京交通大学C语言综合程序设计(黄宇班).doc
  10. Tp5.0对接腾讯云语音验证码