当前位置: 首页 > news >正文

[2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序

冒泡排序

 1 package ch_02;
 2 
 3 public class BubbleSort {
 4  public static void sort(long[] arr) {
 5      long temp = 0;
 6      for(int i = 0; i < arr.length-1; i++) {
 7          // 外层的循环从前向后
 8          for (int j = arr.length - 1; j > i; j--) {
 9              // 内层的循环从后向前, 判断序号靠前的元素是否小于序号靠后的元素
10              // 如果不是, 交换位置
11              if (arr[j - 1] > arr[j]) {
12                  //进行交换
13                  temp = arr[j];
14                  arr[j] = arr[j-1];
15                  arr[j-1] = temp;
16              }
17          }
18      }
19  }
20 }

通过两重循环来实现冒泡排序法, 外层的for循环用来从头开始遍历数组内的所有的元素. 内循环从数组的最后的一个元素开始便利, 每次遍历的次数等于元素总数减去排好的元素的数量, 这通过for 循环内的 j > i; 条件来实现, 每当我们正确的排好一个元素, i就加1. 内层的if判断语句实现的功能是如果在这一次的循环中, 前一个元素的值比后一个元素的值大, 那么就在if语句内调换连个元素的值. 每一次的循环可以确保一个元素被正确的排好位置. 在最坏的情况下, 一个数组需要循环elements-1次, elements表示元素的总量.

 

选择排序SelectSort

 1 package ch_02;
 2 
 3 public class SelectionSort {
 4     public static void sort(long[] arr) {
 5         int k = 0;
 6         long temp = 0;
 7         for (int i = 0; i < arr.length - 1; i++) {
 8             // 这一步和冒泡排序是相同的, 都是从最前开始排序
 9             k = i;
10             for (int j = i; j < arr.length; j++) {
11                 if (arr[j] < arr[k]) {
12                     // 确保k是最小的元素的下标
13                     k = j;
14                 }
15             }
16             temp = arr[i];
17             arr[i] = arr[k];
18             arr[k] = temp;
19         }
20     }
21 }

  最外层和冒泡排序法是相同的, 从下标为0的元素开始遍历全部的数组元素. 内部的循环和冒泡排序法就有很大的不同了, 内循环从起始位置开始, 通过j变量遍历之后的所有的元素, 通过k变量使得k变量一直都是数值最小的元素的下标, 当便利完所有的元素之后, 将k所指的元素的值和最外层的i所指的元素的值交换, 从而实现一位元素的排序, 然后i++, 开始排序下一位, 如此循环, 直到所有位都完成排序. 

 

插入排序

 1 package ch_02;
 2 
 3 public class InsertSort {
 4     
 5     public static void sort(long[] arr) {
 6         
 7         for(int i = 1; i<arr.length; i++){//外层向右的index,即作为比较对象的数据的index
 8             long temp = arr[i];//用作比较的数据, 标准位, 即要替换的位置
 9             int j = i-1;  // j在i前一位
10             while(j>=0 && arr[j]>temp){  //当比到最左边或者遇到比temp小的数据时,结束循环
11                 arr[j+1] = arr[j];  // 当发现前面的元素的值比后一位的元素的值大的时候, 将前一位的值赋给后一位.
12                 j--;  // j继续向前.
13             }
14             arr[j+1] = temp;//把temp放到空位上
15         }
16     }
17 }

 

我自己手写的例子: 20 1 5 8 7

我手工的一步一步的写出了过程.

 

 

   写一下我对插入排序的想法, 这个排序的方法比其他的两个都难理解, 所以我自己手写了全过程, 现在脑子里又了一个动态的过程, 可以写一点东西了. 要理解每一个变量的功能, 这个方法有一个数组参数, 没有返回值. 数组参数就是要排序的数组. 定义了三个变量, int型的tmp、i、j. 理解了这三个变量的功能, 就理解了这个方法是怎么实现的. 首先, 是i变量, 这个变量用来从头开始遍历整个数组的元素, 同时, 这个循环的目标就是每一次否循环, 头能确定i下标的元素为正确位置的元素. 即i的元素在循环后被确定好了. 变量tmp用来保存每一次循环的i下标的数字, 即i下标的元素的值在循环的过程中会被覆盖, 通过tmp保存他的值. j变量初始等于i-1, 说明j永远在i的前面,  while(j>=0 && arr[j]>temp) 这个条件限定了j的范围, j>=0, 表明j可以到达数组的最前方, arr[j]>tmp, 即arr[j] > arr[i], 表明条件是前面的元素的值要大于下标为i的元素的值, 只要满足这个条件, 就执行while循环内的代码—— arr[j+1] = arr[j];j--; , 这段代码的意思是, 只要j下标所对应的元素的值大于i下标对应的元素的值, 那么, 就将j对应的元素的值赋值给j后面一位的元素的值, 然后j再向前一位. 当不符合while循环的条件的时候, 有两种情况, 一种是j == -1, 不满足j >= 0的条件退出, 即i所对应的元素的值比它前面的所有的元素的值都小, 故j--到了-i, 此时执行arr[j+1]=tmp, 相当于arr[0] = arr[i]; 另一种退出while循环的情况是不满足arr[j] > tmp, 即下标i对应的元素前面存在着一个比它小的元素, 从而推出循环, 此时j对应的值是值比i对应的值小的元素的下标, 无处循环后执行arr[j+1] = tmp = arr[i], 相当于将arr[i] 插入到值比它小的元素的后一位. while()循环相当于一只将元素向后移动. 直至数组的第一位或者是遇到一个比tmp值(保存着最初的arr[i]的值)小的元素时, 将tmp插入到第一位或者是插入到比它小的元素的后面. 不断的循环, 直至最后一个元素.

转载于:https://www.cnblogs.com/huangZ-H/p/9976320.html

相关文章:

  • taro 填坑之路(三)taro 缓存
  • deepin bashrc 文件修改后恢复方法
  • Python函数的基础知识
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 关于智能共享出行,政界、学界和业界的专家都说了什么? | SMC 2018
  • vue-cli 打包编译 -webkit-box-orient: vertical 被删除解决办法
  • django发送邮件
  • mysql如何设置两个默认时间列
  • Linux运维命令总结
  • 统计学习方法概论---泛化能力
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • 航迹带您了解消防大队,培养消防意识,消除消防隐患
  • JavaScript的数据结构与算法(五) —— 集合
  • SQLServer之数据库行锁
  • 怎样将手机中的录音转换成文字
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 5、React组件事件详解
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Python进阶细节
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 判断客户端类型,Android,iOS,PC
  • 区块链分支循环
  • 思否第一天
  • 我感觉这是史上最牛的防sql注入方法类
  • 源码安装memcached和php memcache扩展
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (剑指Offer)面试题34:丑数
  • (转)母版页和相对路径
  • (轉貼) UML中文FAQ (OO) (UML)
  • ***详解账号泄露:全球约1亿用户已泄露
  • .naturalWidth 和naturalHeight属性,
  • .net 4.0发布后不能正常显示图片问题
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET CORE Aws S3 使用
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET业务框架的构建
  • /proc/stat文件详解(翻译)
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • [C#]使用DlibDotNet人脸检测人脸68特征点识别人脸5特征点识别人脸对齐人脸比对FaceMesh
  • [COI2007] Sabor
  • [C和指针].(美)Kenneth.A.Reek(ED2000.COM)pdf
  • [Django 0-1] Core.Checks 模块