冒泡排序原理

假设有10个数,第一轮循环,第一个数和第二个数比较,如果第一个数大,第一个数和第二个数交换位置,否则不动;接着第二个数和第三个数比较,如果第二个数大,第二个数和第三个数交换位置,否则不动…第九个数和第十个数比较,如果第九个数大,第九个数和第十个数交换位置,否则不动。第一轮循环结束,最大的数挪到了第十个数的位置,比较进行了9次。
第二轮循环,第一个数和第二个数比较,如果第一个数大,第一个数和第二个数交换位置,否则不动…第八个数和第九个数比较,如果第八个数大,第八个数和第九个数交换位置,否则不动。第二轮循环结束,第二大的数挪到了第九个数的位置,比较进行了8次。

第九轮循环,第一个数和第二个数比较,如果第一个数大,第一个数和第二个数交换位置,否则不动。第九轮循环结束,倒数第二大的数挪到了第二个数的位置,比较进行了1次。
总体原理:每轮比较找到最大的数。

冒泡排序实现思路

先写出内循环

         for (int i = 0; i < a.length - 1 ; i++) {if (a[i] > a[i + 1]) {// changetemp = a[i + 1];a[i + 1] = a[i];a[i] = temp;}}

这个比较好理解,就是第一轮循环
那么第二轮怎么比较呢?其实比较和上一轮几乎一样,只不过比较次数比第一次少1次
第三轮怎么比较呢?其实比较和上一轮几乎一样,只不过比较次数比第二次少1次

所以我们要复用内循环,而内循环的次数由i < a.length - 1 决定,那么,我们要使它每轮循环后递减,不难想到,可以再嵌套循环,将条件改为i < a.length - 1-j;j从零递增,那么第一次,内循环执行了 a.length - 1-0次;第二次,内循环执行了 a.length - 1-1…第九次执行了a.length-1-8次(a.length=10)

冒泡排序的java实现

public class BubbleSort {public static void main(String[] args) {int a[] = { 2, 3, 6, 4, 0, 1, 7, 8, 5, 9 };bubbleSort(a);}public static void toString(int[] a) {for (int i = 0; i < a.length; i++) {System.out.println(a[i]);}}private static void bubbleSort(int[] a) {int length = a.length;int temp = 0;for (int j = 0; j < a.length - 1; j++) {for (int i = 0; i < a.length - 1 - j; i++) {if (a[i] > a[i + 1]) {// changetemp = a[i + 1];a[i + 1] = a[i];a[i] = temp;}}}toString(a);}
}

冒泡排序的比较示意图

选择排序原理

假设有10个数,第一轮循环,第一个数和第二个数比较,如果第一个数大,第一个数和第二个数交换位置,否则不动;接着第一个数和第三个数比较,如果第一个数大,第一个数和第三个数交换位置,否则不动…第一个数和第十个数比较,如果第一个数大,第一个数和第十个数交换位置,否则不动。第一轮循环结束,最小的数挪到了第一个数的位置,比较进行了9次。
第二轮循环,第二个数和第三个数比较,如果第二个数大,第而个数和第三个数交换位置,否则不动…第二个数和第十个数比较,如果第二个数大,第二个数和第十个数交换位置,否则不动。第二轮循环结束,第二小的数挪到了第二个数的位置,比较进行了8次。

第九轮循环,第九个数和第十个数比较,如果第九个数大,第九个数和第十个数交换位置,否则不动。第九轮循环结束,倒数第二小的数挪到了倒数第二个的位置,比较进行了1次。

选择排序(伪)的实现思路

先写内循环,第一轮比较应该是这样

         for (int i = 0; i < length- 1; i++) {if (a[0] > a[i + 1]) {// changetemp = a[0];a[0] = a[i + 1];a[i + 1] = temp;}}

执行完毕后最小的数到0的位置
第二次应该这样

         for (int i = 1; i < length- 1; i++) {if (a[1] > a[i + 1]) {// changetemp = a[1];a[1] = a[i + 1];a[i + 1] = temp;}}

可以推导出以下代码

     for (int j = 0; j <length- 1;j++) {for (int i = j; i < length- 1; i++) {if (a[j] > a[i + 1]) {// changetemp = a[j];a[j] = a[i + 1];a[i + 1] = temp;}}}

选择排序(伪)的java实现

public class SeletSort {public static void main(String[] args) {int a[] = { 2, 3, 6, 4, 0, 1, 7, 8, 5, 9 };seletSort(a);}public static void toString(int[] a) {for (int i = 0; i < a.length; i++) {System.out.println(a[i]);}}private static void seletSort(int[] a) {int length = a.length;int temp = 0;for (int j = 0; j <length- 1;j++) {for (int i = j; i < length- 1; i++) {if (a[j] > a[i + 1]) {// changetemp = a[j];a[j] = a[i + 1];a[i + 1] = temp;}}}toString(a);}
}

选择排序的动态示意图


选择排序(真)的写法

在网上看算法动态图时发现,很多选择排序在每一轮比较会记住最小数字的下标,在这一轮比较结束后将最小的数和这一轮比较的第一个数交换。而不是像上面那样每比较一次都有可能交换,因为上面一种算法没有记录最小元素的下标。按这种实现,代码应该写成这样:

 private static void seletSort(int[] a) {int length = a.length;int temp = 0;int minIndex;for (int j = 0; j <length- 1;j++) {minIndex = j;for (int i = j; i < length- 1; i++) {if (a[minIndex] > a[i + 1]) {minIndex = i+1;}}temp = a[minIndex];a[minIndex]= a[j];a[j]=temp;}toString(a);}

选择排序的意思应该是,在一轮比较中,选择当前比较数中最小的那个,放到最前面的位置,从这个角度看,第二种写法更符合选择排序这个名字呢。(这样写避免了无意义的交换)

推荐:算法动图演示

以下是算法动态图演示,可以帮助理解。
动图演示blog

使用java实现冒泡排序和选择排序相关推荐

  1. Java实现冒泡排序和选择排序

    冒泡排序:依次比较两个相邻的元素,如果他们的顺序(如从大到小.首字母从A到Z)错误就把他们交换过来.走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素已经排序完成. 冒牌排序是稳定排序 ...

  2. 【Java数据结构与算法】第七章 冒泡排序、选择排序、插入排序和希尔排序

    第七章 冒泡排序.选择排序.插入排序和希尔排序 文章目录 第七章 冒泡排序.选择排序.插入排序和希尔排序 一.冒泡排序 1.基本介绍 2.代码实现 二.选择排序 1.基本介绍 2.代码实现 三.插入排 ...

  3. java 排序 1和1_新手入门-冒泡排序和选择排序第一节排序1.1排序概述排序(

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 新手入门-冒泡排序和选择排序 第一节排序 1.1排序概述 排序(sorting)的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列.  ...

  4. java语言冒泡排序法_Java实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等...

    本文实现了八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 .快速排序.归并排序.堆排序和LST基数排序 首先是EightAlgorithms.java文件,代码如下: import jav ...

  5. 【Java】八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序 、快速排序、归并排序、堆排序和LST基数排序

    这篇文章主要介绍了Java如何实现八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 .快速排序.归并排序.堆排序和LST基数排序,需要的朋友可以参考下 本文实现了八个常用的排序算法:插入排序 ...

  6. java排序算法(插入排序,冒泡排序,选择排序)

    java排序算法(插入排序,冒泡排序,选择排序) 先了解原理,然后自己跟着敲一下,加深印象 CMD编译命令:javac -encoding utf-8 SortList.java && ...

  7. JavaSE(二十四)——冒泡排序、选择排序、直接插入排序以及二分查找

    文章目录 1. 冒泡排序 2. 选择排序 3. 直接插入排序 4. 二分查找 1. 冒泡排序 原理:数组元素两两比较,大的往后放,经过一轮比较后,最大元素在最后面,如此往复. 举例说明: 代码: // ...

  8. 十大排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序

    冒泡排序.选择排序.插入排序.希尔排序.归并排序.快速排序.堆排序.计数排序.桶排序.基数排序的动图与源代码. 目录 关于时间复杂度 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 ...

  9. c语言排序需要插空的最小次数,C语言数组排序——冒泡排序、选择排序、插入排序...

    一.冒泡排序 原理解析:(以从小到大排序为例)在一排数字中,将第一个与第二个比较大小,如果后面的数比前面的小,则交换他们的位置. 然后比较第二.第三个--直到比较第n-1个和第n个,此时,每一次比较都 ...

最新文章

  1. Java项目:后台管理系统脚手架项目(java+SpringBoot+FreeMarker+mysql+JSP)
  2. EF中 GroupJoin 与 Join
  3. JavaWeb学习总结(十三):使用Session防止表单重复提交
  4. 微软最爽命令行工具发布!
  5. 【APICloud系列|33】通过程序循环数据集合的时候闭包加入imageCache方法
  6. C#中一些格式的转换
  7. Android官方开发文档Training系列课程中文版:电池续航时间优化之监测电池电量及充电状态
  8. 初探Thymeleaf模板引擎
  9. 分类图片展示php源码,HTML5+jQuery插件Quicksand实现超酷的星际争霸2兵种分类展示效果(附demo源码下载)...
  10. c#多通道波形显示_因为每秒要采集50多个波形,需要大量的数据分析和波形分析,有什么好的解决办法吗?...
  11. Playframework项目启动后自动停止问题记录
  12. python循环三次跳出循环_Python3 跳出多重循环 for...else...
  13. CICD详解(十六)——Sonar报错:java.lang.IllegalStateException: Webapp did not start解决
  14. 运维软件推荐(附带软件百度网盘分享)
  15. 数据库课程设计------书店管理系统
  16. 我在Blue Nile(蓝色尼罗河)上通过python爬取一百万颗钻石,最终选出心仪的一颗
  17. 英伟达显卡玩CF怎么提高帧数
  18. panda是删除行_pandas删除包含指定内容的行
  19. 黑马程序员——多线程
  20. GSM-GPRS-WCDMA-LTE-5g 的总结

热门文章

  1. foreach输出mysql方法_mysql – “foreach”循环:使用R中的所有核心(特别是如果我们在foreach循环中发送sql查询)...
  2. TCP协议中三次握手
  3. Python 多线程进程高级指南(二)
  4. 【转】企业网站建设方法论
  5. document 文挡对象详解(JavaScript脚本语言描述)
  6. 引脚悬空是什么电平_STM32单片机必须掌握的八种IO口模式和引脚配置方式
  7. 数据库服务器主机重启故障诊断分析
  8. Oracle 20c 新特性:强制大小写敏感密码文件 Force Password File Case Sensitive
  9. SQL执行效率提升几万倍的操作详解!
  10. DBA想要拓展技能,拿下高薪Offer,这些原创公众号你关注了吗?